我有一个数据框如下所示。
df =pd.DataFrame({'ID': [1, 2, 3, 4, 5], 'contract1' :["A", "B", "C", "D", "B"],
'contract2' :["C", "A", np.nan, "A", np.nan],
'contract3' :[np.nan, "C", np.nan, np.nan, np.nan] })
df
ID contract1 contract2 contract3
1 A C nan
2 B A C
3 C nan nan
4 D A nan
5 B nan nan
我希望这样的旗帜结果;
ID A B C D
1 1 0 1 0
2 1 1 1 0
3 0 0 1 0
4 1 0 0 1
5 0 1 0 0
此标志表显示每个ID是否包含每个合同。 也许枢轴是可用的,但我无法处理这种复杂的数据帧...... 我可以问一下如何改造吗?
答案 0 :(得分:3)
更快的实施方法是将melt
与str.get_dummies
结合使用,如下所示:
pd.melt(df, id_vars=['ID']).set_index('ID')['value'] \
.str.get_dummies() \
.groupby(level=0) \
.agg(np.sum)
A B C D
ID
1 1 0 1 0
2 1 1 1 0
3 0 0 1 0
4 1 0 0 1
5 0 1 0 0
答案 1 :(得分:1)
您可以将原始数据框格融合为长格式,然后在ID和值列上使用crosstab()
:
import pandas as pd
df1 = df.set_index('ID').stack().rename("Type").reset_index()
pd.crosstab(df1.ID, df1.Type)
# Type A B C D
# ID
# 1 1 0 1 0
# 2 1 1 1 0
# 3 0 0 1 0
# 4 1 0 0 1
# 5 0 1 0 0
答案 2 :(得分:1)
我们也可以使用melt/pivot_table
res = pd.melt(df, id_vars = ['ID'], value_vars = ['contract1',
'contract2', 'contract3']).pivot_table(index = 'ID',
columns = 'value', fill_value = 0, aggfunc=len)
print(res)
# variable
#value A B C D
#ID
#1 1 0 1 0
#2 1 1 1 0
#3 0 0 1 0
#4 1 0 0 1
#5 0 1 0 0
import pandas as pd;
import numpy as np;
df =pd.DataFrame({'ID': [1, 2, 3, 4, 5], 'contract1' :["A", "B", "C", "D", "B"],
'contract2' :["C", "A", np.nan, "A", np.nan],
'contract3' :[np.nan, "C", np.nan, np.nan, np.nan] })
df