我有这个熊猫DataFrame:
df = pd.DataFrame(
data=[
['yes', 'no', np.nan],
['no', 'yes', 'no'],
[np.nan, 'yes', 'yes'],
['no', 'no', 'no']
],
index=pd.Index(['xyz_1', 'xyz_2', 'xyz_3', 'xyz_4'], name='ID'),
columns=['class1', 'class2', 'class3']
)
print(df)
Out:
ID class1 class2 class3
xyz_1 yes no NaN
xyz_2 no yes no
xyz_3 NaN yes yes
xyz_4 no no no
我想在每行的类列中获得“是”和“否”的频率,并有一个新的数据框,如下所示:
ID yes no nan
xyz_1 1 1 1
xyz_2 1 2 0
xyz_3 2 0 1
xyz_4 0 3 0
我看了this个问题,但我不希望总和,但很重要。
有什么想法吗?
答案 0 :(得分:2)
使用pd.get_dummies
,但将dummy_na
设置为True
:
pd.get_dummies(
df, prefix='', prefix_sep='', dummy_na=True
).groupby(level=0, axis=1).sum() # Sum the *counts* for each column.
nan no yes
ID
xyz_1 1 1 1
xyz_2 0 2 1
xyz_3 1 0 2
xyz_4 0 3 0
答案 1 :(得分:1)
您可以选中melt
+ crosstab
newdf=df.melt('ID')
pd.crosstab(newdf.ID,newdf.value.fillna('NaN'))
Out[8]:
value NaN no yes
ID
xyz_1 1 1 1
xyz_2 0 2 1
xyz_3 1 0 2
xyz_4 0 3 0
答案 2 :(得分:0)
df = df.set_index('ID') # Do this line only if 'ID' is not index
df2 = pd.get_dummies(df, dummy_na=True)
df['no'] = df2[df2.columns[df2.columns.str.endswith('no')]].sum(1)
df['yes'] = df2[df2.columns[df2.columns.str.endswith('yes')]].sum(1)
df['nan'] = df2[df2.columns[df2.columns.str.endswith('nan')]].sum(1)