将 n 个数据帧中的 Concatenate/Merge 个同名列动态添加到新数据帧中
Dynamically Concatenate/Merge Columns of Same Name from n Data Frames Into New Data Frame
我在一个列表中有 17 个数据框 dataframes
,它们都具有相同的列名和长度,除了描述数据源的第一列。有 7 列描述了数据的日期,对于每一行的每个数据框来说也是相同的。因此,每个数据框共有 19 列。我想做的是动态连接具有相同列名的每一列,这样共有 11 个数据框,其中 24 列,其中 7 列描述日期,另外 17 列是共享相同的连接列17 个数据框列表的列名。
下面只是 3 个数据框和预期结果的示例。
df1 = pd.DataFrame(np.array([
['a', 1, 3, 9],
['a', 2, 4, 61],
['a', 3, 24, 9]]),
columns=['name', 'date','attr11', 'attr12'])
df2 = pd.DataFrame(np.array([
['b', 1, 5, 19],
['b', 2, 14, 16],
['b', 3, 4, 9]]),
columns=['name','date', 'attr11', 'attr12'])
df3 = pd.DataFrame(np.array([
['c', 1, 3, 49],
['c', 2, 4, 36],
['c', 3, 14, 9]]),
columns=['name','date' ,'attr11', 'attr12']
结果
dfattr11
[1, 3, 5, 49],
[2, 4, 14, 36],
[3, 24, 4, 9]]),
columns=['date', 'attr11', 'attr11', 'attr11']
dfattr12...
new_dataframes = [dfattr11, dfattr12, ...]
我尝试使用 作为指导,但似乎该解决方案堆叠了与平行相反的列。
我知道我将如何使用 concat 创建一个新的数据框,但是当尝试以迭代方式或动态方式执行此操作时,挑战就出现了,因为有 17 个数据框,每个数据框有 11 列,需要放入它们单独的 df 中。任何帮助将不胜感激。
IIUC,你可以使用 pandas.concat
生成一个包含所有数据的大数据帧并使用 groupby
拆分它。您将获得一个数据框字典作为输出:
dfs = [df1,df2,df3]
out = {k: d.droplevel(0, axis=1) for k,d in
pd.concat({d['name'].iloc[0]: d.set_index('date')
.drop(columns='name')
for d in dfs}, axis=1)
.groupby(level=1, axis=1)
}
输出:
{'attr11': attr11 attr11 attr11
date
1 3 5 3
2 4 14 4
3 24 4 14,
'attr12': attr12 attr12 attr12
date
1 9 19 49
2 61 16 36
3 9 9 9}
我在一个列表中有 17 个数据框 dataframes
,它们都具有相同的列名和长度,除了描述数据源的第一列。有 7 列描述了数据的日期,对于每一行的每个数据框来说也是相同的。因此,每个数据框共有 19 列。我想做的是动态连接具有相同列名的每一列,这样共有 11 个数据框,其中 24 列,其中 7 列描述日期,另外 17 列是共享相同的连接列17 个数据框列表的列名。
下面只是 3 个数据框和预期结果的示例。
df1 = pd.DataFrame(np.array([
['a', 1, 3, 9],
['a', 2, 4, 61],
['a', 3, 24, 9]]),
columns=['name', 'date','attr11', 'attr12'])
df2 = pd.DataFrame(np.array([
['b', 1, 5, 19],
['b', 2, 14, 16],
['b', 3, 4, 9]]),
columns=['name','date', 'attr11', 'attr12'])
df3 = pd.DataFrame(np.array([
['c', 1, 3, 49],
['c', 2, 4, 36],
['c', 3, 14, 9]]),
columns=['name','date' ,'attr11', 'attr12']
结果
dfattr11
[1, 3, 5, 49],
[2, 4, 14, 36],
[3, 24, 4, 9]]),
columns=['date', 'attr11', 'attr11', 'attr11']
dfattr12...
new_dataframes = [dfattr11, dfattr12, ...]
我尝试使用
我知道我将如何使用 concat 创建一个新的数据框,但是当尝试以迭代方式或动态方式执行此操作时,挑战就出现了,因为有 17 个数据框,每个数据框有 11 列,需要放入它们单独的 df 中。任何帮助将不胜感激。
IIUC,你可以使用 pandas.concat
生成一个包含所有数据的大数据帧并使用 groupby
拆分它。您将获得一个数据框字典作为输出:
dfs = [df1,df2,df3]
out = {k: d.droplevel(0, axis=1) for k,d in
pd.concat({d['name'].iloc[0]: d.set_index('date')
.drop(columns='name')
for d in dfs}, axis=1)
.groupby(level=1, axis=1)
}
输出:
{'attr11': attr11 attr11 attr11
date
1 3 5 3
2 4 14 4
3 24 4 14,
'attr12': attr12 attr12 attr12
date
1 9 19 49
2 61 16 36
3 9 9 9}