如何将包含不同数据的多个数据帧合并为一个?

问题描述 投票:1回答:3

我有几个-假设三个-数据帧包含另一个数据帧的不同行(有时它们可​​以重叠)。所有三个df的列均相同。我现在要创建最终的数据框,其中将包含上述三个数据框的所有行。此外,我需要为最终df生成一列,其中将包含其中包含此特定行的前三个df之一的信息。

下面的示例

原始数据框:

 original_df = pd.DataFrame(np.array([[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]]), columns = ['label1','label2'])

三个包含不同原始df的df:

a = original_df.loc[0:1, columns]
b = original_df.loc[2:2, columns]
c = original_df.loc[3:, columns]

我想获得以下数据框:

final_df = pd.DataFrame(np.array([[1,1,'a'],[2,2,'a'],[3,3,'b'],[4,4,'c'],\
[5,5,'c'],[6,6,'c']]), columns = ['label1','label2', 'from which df this row'])

或简单地使用整数来标记该行来自哪个df:

final_df = pd.DataFrame(np.array([[1,1,1],[2,2,1],[3,3,2],[4,4,3],\
[5,5,3],[6,6,3]]), columns = ['label1','label2', 'from which df this row'])

谢谢您!

python-3.x pandas numpy dataframe
3个回答
1
投票

See this related post

IIUC,您可以将pd.concatkeysnames参数一起使用

pd.concat(
    [a, b, c], keys=['a', 'b', 'c'],
    names=['from which df this row']
).reset_index(0)

  from which df this row  label1  label2
0                      a       1       1
1                      a       2       2
2                      b       3       3
3                      c       4       4
4                      c       5       5
5                      c       6       6

但是,我建议您将这些数据框片段存储在字典中。

parts = {
    'a': original_df.loc[0:1],
    'b': original_df.loc[2:2],
    'c': original_df.loc[3:]
}

pd.concat(parts, names=['from which df this row']).reset_index(0)

  from which df this row  label1  label2
0                      a       1       1
1                      a       2       2
2                      b       3       3
3                      c       4       4
4                      c       5       5
5                      c       6       6

并且只要将其存储为字典,您也可以像这样使用assign

pd.concat(d.assign(**{'from which df this row': k}) for k, d in parts.items())

   label1  label2 from which df this row
0       1       1                      a
1       2       2                      a
2       3       3                      b
3       4       4                      c
4       5       5                      c
5       6       6                      c

请记住,我使用双斜线**,因为您的列名带有空格。如果您的列名没有空格,我们可以这样做

pd.concat(d.assign(WhichDF=k) for k, d in parts.items())

   label1  label2 WhichDF
0       1       1       a
1       2       2       a
2       3       3       b
3       4       4       c
4       5       5       c
5       6       6       c

0
投票

只需创建一个列表,最后将其连接:

list_df = []
list_df.append(df1)
list_df.append(df2)
list_df.append(df3)
df = pd.concat(liste_df)

0
投票

也许这可以为您工作/为您增加价值:)

import pandas as pd

# from your post
a = original_df.loc[0:1, columns]
b = original_df.loc[2:2, columns]
c = original_df.loc[3:, columns]

# create new column to label the datasets
a['label'] = 'a'
b['label'] = 'b'
c['label'] = 'c'

# add each df to a list
combined_l = []
combined_l.append(a)
combined_l.append(b)
combined_l.append(c)

# concat all dfs into 1
df = pd.concat(liste_df)
© www.soinside.com 2019 - 2024. All rights reserved.