熊猫concat /更新3 dfs

时间:2018-10-25 07:44:17

标签: python pandas

我有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的所有列,而我不需要

1 个答案:

答案 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