我有3个不同的df,但都具有不同的列,但ID为1。 我不太在乎不同的数据,最后我只想要一个包含ID和另外三列的DF,如果DF中存在ID,则每列包含1;如果ID存在,则每列包含0(或不包含)不存在。
一个例子:
DF1
index irrelevant columns
A
B
C
DF2
index irrelevant columns2
A
B
F
DF3
index irrelevant columns3
A
F
G
最终DF
index DF1 DF2 DF3
A 1 1 0
B 1 1 0
C 1 0 0
F 0 1 1
G 0 0 1
到目前为止,我正在做的事情(在内存方面非常糟糕)是(考虑索引= ID)
df1['df1'] = 1
df1 = pd.DataFrame(df1['df1']) # There has to be a way around this that does not require to create a new DF
df2['df2'] = 1
df2 = pd.DataFrame(df2['df2'])
df3['df3'] = 1
df3 = pd.DataFrame(df3['df3'])
data = pd.concat([df1,df2,df3], sort=False, axis=1)
我确信必须有一种更好的方法,该方法不需要我仅使用该列创建新的df,但是我尝试过的所有操作都会写入dfs的所有列,而我不需要
答案 0 :(得分:1)
将列表理解与DataFrame
构造函数和Index.to_series
一起使用,然后通过notna
检查不丢失的值并将掩码转换为整数:
dfs = {'DF1': DF1, 'DF2': DF2, 'DF3': DF3}
comp = {k: v.index.to_series() for k, v in dfs.items()}
df = pd.DataFrame(comp).notna().astype(int)
由建设者提供的Series
的另一种解决方案:
comp = {k: pd.Series(1, index=v.index) for k, v in dfs.items()}
df = pd.DataFrame(comp).fillna(0).astype(int)
print (df)
DF1 DF2 DF3
A 1 1 1
B 1 1 0
C 1 0 0
F 0 1 1
G 0 0 1
使用MultiLabelBinarizer
的另一种解决方案:
dfs = {'DF1': DF1, 'DF2': DF2, 'DF3': DF3}
L = [v.index for k, v in dfs.items()]
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(L),index=list(dfs.keys())).T
print (df)
DF1 DF2 DF3
0 1 1 1
1 1 1 0
2 1 0 0
3 0 1 1
4 0 0 1