For循环,将Pandas数据框与公共列合并

时间:2020-05-29 14:34:34

标签: python pandas dataframe

我有25个数据框,每个数据框都有7个升序日期(作为行),以570-600个机场名称为列。最大的问题是,由于数据框存储每个机场每天的上扬次数,因此某些机场处于非活动状态的几周会导致数据框具有不同的订单和数量,例如机场名称不同。所有列名称都将按字母顺序出现在每个数据框中,但是数据框中仅缺少一个机场列会破坏主数据框的整个对齐方式。

我尝试过合并,合并,连接,更新...这个问题确实很复杂,我的最终目标是要有一个主数据框,其中所有现有按字母顺序排列的机场都作为列,而进行中的行随着日期的升迁和时间的推移而变化

我认为我必须做一个for循环来做到这一点: 1.不会丢失任何数据 2.它需要按列合并数据帧,以便如果第二个数据帧的列名与第一个数据帧的列名相同,则新数据将添加到该列的下面,而无需再次重复该列名。 3.如果第二个的列名与第一个的列名不同,我希望将该列作为新列添加(希望按字母顺序)。 4.如果第二个数据框没有第一个数据框具有的列,那么我要说该机场的NAN。

总而言之,我想要for循环执行的主要部分是在相同的列下添加数据(即使数据框的列顺序混乱),添加以前不存在的列,并填写机场所在的NAN缺少,并确保列名仅显示为0行。抱歉,很难解释。

这是两个我希望for循环能够合并的简单数据框示例

df1 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                    columns=['Airport1', 'Airport3', 'Airport4'])
df1.index.name='Dates'
df1.index=['11/01','11/02','11/03']
df2 = pd.DataFrame(np.array([[2, 4, 6], [8, 10, 12], [14, 16, 18]]),
                    columns=['Airport1', 'Airport2', 'Airport3'])
df2.index.name='Dates'
df2.index=['11/04','11/05','11/06']
display(df1,df2)

Dates **Airport1** **Airport3** **Airport4** 
11/01   1.            2.          3.  
11/02   4.            5.          6.   
11/03   7.            8.          9.

Dates **Airport1** **Airport2** **Airport3**
11/04   2.           4.           6
11/05   8.           10.          12
11/06   14.          16.          18

我希望for循环具有的结果是:

Dates **Airport1** **Airport2** **Airport3** **Airport4**
11/01   1.              NAN.         2.           3
11/02.  4.              NAN.         5.           6
11/03.  7.              NAN.         8.           9
11/04.  2.               4.          6.          NAN      
11/05.  8.              10.          12.         NAN
11/06.  14.             16.          18.         NAN

另一个注意事项是,我有25个数据帧要合并和计数,因此我希望for循环能够接收无限个数据帧。提前非常感谢!!!

1 个答案:

答案 0 :(得分:2)

IIUC,您可以将pd.concatdf.sort_index一起使用:

df = pd.concat([df1, df2]).sort_index(axis=1)

如果数据框超过两个,请使用:

from functools import reduce

dfs = [df1, df2] # list of all dataframes that need's to be combined
df = reduce(lambda d1, d2: pd.concat([d1, d2]), dfs).sort_index(axis=1)

结果:

# print(df)

       Airport1  Airport2  Airport3  Airport4
11/01         1       NaN         2       3.0
11/02         4       NaN         5       6.0
11/03         7       NaN         8       9.0
11/04         2       4.0         6       NaN
11/05         8      10.0        12       NaN
11/06        14      16.0        18       NaN
相关问题