熊猫:浓缩调查结果

问题描述 投票:1回答:2

我的调查结果具有以下格式:

   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)
python pandas
2个回答
2
投票

您可以通过stack重新塑造DataFrame并使用groupbylist构造函数创建新的DataFrame

a = df.stack().reset_index().groupby('level_0')['level_1'].apply(list)
df = pd.DataFrame(a.values.tolist())

另一个解决方案是转换为bool - 空的空间是Falses,对于每一行创建列表,最后使用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

1
投票

还有一个

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
© www.soinside.com 2019 - 2024. All rights reserved.