我有以下数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Q1': ['A,B', 'A,C', 'A,B', 'B,C', 'A,B,C','C,B,A','B,C,A'],
'Q2': ['B,A', 'C,A', 'B,C,A', 'A,B', 'A,C', 'B,C','C,B'],
'Q3': ['C,A', 'C,B', 'A,B', 'C,B', 'A,B,C','A,B,C','C,A']})
df['Q1'] = df['Q1'].apply(lambda x: x.split(','))
df['Q2'] = df['Q2'].apply(lambda x: x.split(','))
df['Q3'] = df['Q3'].apply(lambda x: x.split(','))
colQ1 = df["Q1"].explode().unique()
colQ1df = pd.DataFrame(columns = colQ1)
df = pd.concat([df, colQ1df], sort=False)
print(df)
如果列“Q1”包含“A”,我想用“1”填充新列“A”,如果不包含“A”,则填充 0。
最佳答案
不要爆炸值,最好使用Series.str.get_dummies
与 concat
如果需要以相同的方式处理每一列:
df = pd.DataFrame({'Q1': ['A,B', 'A,C', 'A,B', 'B,C', 'A,B,C','C,B,A','B,C,A'],
'Q2': ['B,A', 'C,A', 'B,C,A', 'A,B', 'A,C', 'B,C','C,B'],
'Q3': ['C,A', 'C,B', 'A,B', 'C,B', 'A,B,C','A,B,C','C,A']})
df = pd.concat([df[x].str.get_dummies(',') for x in df], keys=df.columns, axis=1)
df.columns = df.columns.map('_'.join)
print (df)
Q1_A Q1_B Q1_C Q2_A Q2_B Q2_C Q3_A Q3_B Q3_C
0 1 1 0 1 1 0 1 0 1
1 1 0 1 1 0 1 0 1 1
2 1 1 0 1 1 1 1 1 0
3 0 1 1 1 1 0 0 1 1
4 1 1 1 1 0 1 1 1 1
5 1 1 1 0 1 1 1 1 1
6 1 1 1 0 1 1 1 0 1
如果希望每列分隔 Dataframe:
df1 = df['Q1'].str.get_dummies(',')
print (df1)
A B C
0 1 1 0
1 1 0 1
2 1 1 0
3 0 1 1
4 1 1 1
5 1 1 1
6 1 1 1
关于python - 根据值是否位于另一列的列表中,用 0 或 1 填充空 (NaN) 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60971190/