添加指示器以告知数据来自何处 Python

Add indicator to inform where the data came from Python

非常感谢阅读。

我有一个 pandas 数据框,它是多个较小数据框串联的结果。我想要做的是向我的最终数据框添加多个指示器列,这样我就可以看到每一行来自哪个较小的数据框。

这就是我想要的结果:

Forename   Surname   Ind_1    Ind_2    Ind_3    Ind_4

jon          smith     0        0         0        1
charlie      jim       1        0         0        1
ian          james     0        1         0        0

例如,"Jon Smith" 来自数据帧 4,而“查理吉姆”来自数据帧 1 和 4(重复行)。

对于仅来自一个数据帧的行(例如第 1 行和第 3 行)我已经能够实现这一点,但对于来自多个数据帧的重复行(例如第 2 行)则无法实现。

非常感谢您的帮助。

您可以使用:


df1 = pd.DataFrame({'Forename':['charlie'], 'Surname':['jim']})
df2 = pd.DataFrame({'Forename':['ian'], 'Surname':['james']})
df3 = pd.DataFrame()
df4 = pd.DataFrame({'Forename':['charlie', 'jon'], 'Surname':['jim', 'smith']})

#list of DataFrames
dfs = [df1, df2, df3, df4]
#generate indicators
inds = ['Ind_{}'.format(x+1) for x in range(len(dfs))]
df = (pd.concat(dfs, keys=inds)
       .reset_index()
       .groupby(['Forename','Surname'])['level_0']
       .apply('|'.join)
       .str.get_dummies()
       .reindex(columns=inds, fill_value=0)
       .reset_index())

print (df)
  Forename Surname  Ind_1  Ind_2  Ind_3  Ind_4
0  charlie     jim      1      0      0      1
1      ian   james      0      1      0      0
2      jon   smith      0      0      0      1

所有列 groupby 的更通用解决方案:

df = pd.concat(dfs, keys=inds)
print (df)
        Forename Surname
Ind_1 0  charlie     jim
Ind_2 0      ian   james
Ind_4 0  charlie     jim
      1      jon   smith

df1 =(df.reset_index()
       .groupby(df.columns.tolist())['level_0']
       .apply('|'.join)
       .str.get_dummies()
       .reindex(columns=inds, fill_value=0)
       .reset_index())

print (df1)
  Forename Surname  Ind_1  Ind_2  Ind_3  Ind_4
0  charlie     jim      1      0      0      1
1      ian   james      0      1      0      0
2      jon   smith      0      0      0      1