Python 使用相交日期时间索引合并或连接多个 dfs

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

使用 Pandas,您可以将多个数据帧与时间戳列和公共列(在本例中)站、经度、纬度和多个变量列合并在单独的文件中,但不能重复公共列,或者在时间列中具有多行最终结果?

各个 csv 文件的示例: example data input file 1

example data input file 2

目标文件: end result example

pd.merge(以及 merge_ordered 和 merge_asof)似乎无法与多列索引一起正常工作,或者它返回车站、纬度和经度的重复后缀列。

将时间列转换为日期时间索引并使用 pd.concat 似乎是正确的方法...但是如何修复单独的时间行并摆脱 NaN 值?我认为索引上的 groupby 可能是一种可行的方法,但是如何呢?

python pandas merge
1个回答
0
投票

如果没有代码示例,可能很难重现您的问题。我手工制作了两个 DataFrame 来复制您的数据。

index_common = [
    datetime(2023,1,1,0,0,0,0).strftime('%Y-%m-%dT%H:%M:%SZ'),
    datetime(2023,1,1,1,0,0,0).strftime('%Y-%m-%dT%H:%M:%SZ'),
    datetime(2023,1,1,2,0,0,0).strftime('%Y-%m-%dT%H:%M:%SZ')
]
data_1 = {
    'station': ['GridPointRequestedAt[23.553S_133.396E]']*3, 
    'longitude': [-23.53]*3,
    'latitude': [133.36]*3,
    'ta50m': [300.11, 301.61, 303.60]
}
data_2 = {
    'station': ['GridPointRequestedAt[23.553S_133.396E]']*3, 
    'longitude': [-23.53]*3,
    'latitude': [133.36]*3,
    'ua50m': [-3.38, -5.17, -7.21]
}

df_1 = pd.DataFrame(data=data_1, index=index_common)
df_2 = pd.DataFrame(data=data_2, index=index_common)

当查看它们时,它们共享一个共同的时间戳索引。

In [1]: df1
Out[1]:
                                                     station longitude latitude ta50m
2023-01-01T00:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  300.11
2023-01-01T01:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  301.61
2023-01-01T02:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  303.60

In [2]: df2
Out[2]: 
                                                      station longitude latitude ua50m
2023-01-01T00:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  -3.38
2023-01-01T01:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  -5.17
2023-01-01T02:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  -7.21

这里的想法是重置两个 DataFrame 的索引,并使用

pd.merge
函数将 DataFrame 合并到前时间戳索引和公共列上:

df_merged = df_1.reset_index(names=['timestamp']).merge(
    df_2.reset_index(names=['timestamp']), 
    how='inner', 
    on=['timestamp', 'station', 'longitude', 'latitude']
)

最后,如果您需要让时间戳作为索引而不是作为适当的列,您可以运行:

df_merged.set_index("timestamp")
In [3]: df_merged
Out[3]:
                                                     station  longitude latitude ta50m ua50m
timestamp                   
2023-01-01T00:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  300.11  -3.38
2023-01-01T01:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  301.61  -5.17
2023-01-01T02:00:00Z    GridPointRequestedAt[23.553S_133.396E]  -23.53  133.36  303.60  -7.21

PS: 要轻松共享数据示例,您可以运行

df.head().to_dict()
并在此处共享输出。

© www.soinside.com 2019 - 2024. All rights reserved.