如何将选定列附加到具有不同列的df的pandas数据帧

时间:2015-03-29 22:47:52

标签: python pandas dataframe

我希望能够将df1 df2,df3附加到一个df_All中,但由于每个数据帧都有不同的列。我怎么能在for循环中做这个(我还有其他东西,我必须在for循环中做)?

import pandas as pd
import numpy as np

df1 = pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])])
df2 = pd.DataFrame.from_items([('B', [5, 6, 7]), ('A', [8, 9, 10])])
df3 = pd.DataFrame.from_items([('C', [5, 6, 7]), ('D', [8, 9, 10]), ('A',[1,2,3]), ('B',[4,5,7])])
list = ['df1','df2','df3']
df_All = pd.DataFrame()
for i in list:
   # doing something else as well --- 
    df_All = df_All.append(i)

enter image description here

我希望我的df_All只有(A& B),有没有办法在上面循环?像只追加这两列的东西?

2 个答案:

答案 0 :(得分:5)

如果我了解您的需求,那么您只需选择列' A'和' B'从df3开始,然后使用pd.concat

In [35]:

df1 = pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])])
df2 = pd.DataFrame.from_items([('B', [5, 6, 7]), ('A', [8, 9, 10])])
df3 = pd.DataFrame.from_items([('C', [5, 6, 7]), ('D', [8, 9, 10]), ('A',[1,2,3]), ('B',[4,5,7])])
df_list = [df1,df2,df3[['A','B']]]
pd.concat(df_list, ignore_index=True)
Out[35]:
    A  B
0   1  4
1   2  5
2   3  6
3   8  5
4   9  6
5  10  7
6   1  4
7   2  5
8   3  7

请注意,在您的原始代码中,这是不好的做法:

list = ['df1','df2','df3']

这会影响内置类型list加上即使它实际上是一个有效的var名称,例如df_list,您创建了一个字符串列表而不是dfs列表。

如果要确定公共列,则可以使用列上的np.intersection方法确定:

In [39]:

common_cols = df1.columns.intersection(df2.columns).intersection(df3.columns)
common_cols
Out[39]:
Index(['A', 'B'], dtype='object')

答案 1 :(得分:5)

您还可以使用set comprehension连接任意DataFrame列表中的所有常用列:

df_list = [df1, df2, df3]
common_cols = list(set.intersection(*(set(c) for c in df_list)))
df_new = pd.concat([df[common_cols] for df in df_list], ignore_index=True)
>>> df_new 
    A  B
0   1  4
1   2  5
2   3  6
3   8  5
4   9  6
5  10  7
6   1  4
7   2  5
8   3  7