添加指示器以告知数据来自何处 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 行)则无法实现。
非常感谢您的帮助。
您可以使用:
- 第一个
concat
参数 key
s 用于识别 DataFrames
reset_index
来自 MultiIndex
的列
groupby
并加入指标
- 通过
str.get_dummies
创建指标
reindex
如果需要为缺失的类别追加 0 列
reset_index
来自 Index
的列
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
非常感谢阅读。
我有一个 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 行)则无法实现。
非常感谢您的帮助。
您可以使用:
- 第一个
concat
参数key
s 用于识别 DataFrames reset_index
来自MultiIndex
的列
groupby
并加入指标- 通过
str.get_dummies
创建指标
reindex
如果需要为缺失的类别追加 0 列reset_index
来自Index
的列
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