我有 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 循环能够接收无限数据帧。非常感谢!
最佳答案
IIUC,你可以试试pd.concat
以及df.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
关于python - For 循环将 pandas 数据框与公共(public)列合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62088372/