我的调查结果具有以下格式:
Lab Shepherd Poodle Frisky Sleepy Hungry
0 NaN NaN Yes Yes NaN NaN
1 Yes NaN NaN NaN NaN Yes
2 NaN Yes NaN NaN Yes NaN
我想将我的数据帧转换为以下内容:
Breed Disposition
0 Poodle Frisky
1 Lab Hungry
2 Shepherd Sleepy
实现这一目标的最有效方法是什么?通过...分组?枢?
用'True'替换'Yes'的每个实例并使用布尔测试有什么好处吗?
提前致谢。接下来是DataFrame代码,以便于回答。
d = [['', '','Yes','Yes','',''],['Yes', '','','','','Yes'],['','Yes','','','Yes','']]
df = pd.DataFrame(data=d,columns=['Lab','Shepherd','Poodle','Frisky','Sleepy','Hungry'])
df.replace(r'^\s*$', np.nan, regex=True, inplace = True)
您可以通过stack
重新塑造DataFrame
并使用groupby
和list
构造函数创建新的DataFrame
:
a = df.stack().reset_index().groupby('level_0')['level_1'].apply(list)
df = pd.DataFrame(a.values.tolist())
另一个解决方案是转换为bool
- 空的空间是False
s,对于每一行创建列表,最后使用DataFrame
构造函数:
a = df.astype(bool).apply(lambda x: x.index[x].values.tolist(), axis=1)
df = pd.DataFrame(a.values.tolist())
df = df.astype(bool).apply(lambda x: pd.Series(x.index[x].values), axis=1)
print (df)
0 1
0 Poodle Frisky
1 Lab Hungry
2 Shepherd Sleepy
还有一个
pd.DataFrame([df.columns.values[x] for x in df.notnull().values])
Out[145]:
0 1
0 Poodle Frisky
1 Lab Hungry
2 Shepherd Sleepy