【问题标题】:Extracting column from dataframe based on matching three column values in another dataframe基于匹配另一个数据框中的三列值从数据框中提取列
【发布时间】:2022-02-22 00:30:50
【问题描述】:

我有两个数据框:

import pandas as pd

df1 = pd.DataFrame(columns={'Date', 'latitude' , 'longitude' , 'tg'})

df1.head(5).to_dict() : 

{'Date': {0: Timestamp('1984-01-01 00:00:00'), 1: Timestamp('1984-01-02 
00:00:00'), 2: Timestamp('1984-01-03 00:00:00'), 3: Timestamp('1984-01-04 00:00:00'), 4: Timestamp('1984-01-05 00:00:00')}, 'longitude': {0: 13.875,
 1: 13.875, 2: 13.875, 3: 13.875, 4: 13.875}, 'tg': {0: 5.339999675750732, 
1: 2.559999942779541, 2: 4.019999980926514, 3: -0.07000000029802322, 4: 
-2.259999990463257}, 'latitude': {0: 49.125, 1: 49.125, 2: 49.125, 3: 
49.125, 4: 49.125}}



df2 = pd.DataFrame(columns={'Date', 'latitude_rr' , 'longitude_rr' , 'Runoff' , 'rr'})

df2.head(5).to_dict() : 

{'Date': {0: Timestamp('1984-01-01 00:00:00'), 1: Timestamp('1984-01-02 
00:00:00'), 2: Timestamp('1984-01-03 00:00:00'), 3: Timestamp('1984-01-04 
00:00:00'), 4: Timestamp('1984-01-05 00:00:00')}, 'latitude_rr': {0: 49.125, 
1: 49.125, 2: 49.125, 3: 49.125, 4: 49.125}, 'longitude_rr': {0: 13.875, 1: 
13.875, 2: 13.875, 3: 13.875, 4: 13.875}, 'Runoff': {0: 0.3808451, 1: 
0.3808451, 2: 0.6760563, 3: 1.464789, 4: 2.456338}, 'rr': {0: 0.0, 1: 0.0, 
2: 2.799999952316284, 3: 2.200000047683716, 4: 0.4000000059604645}}

我试图在 df1.Date 等于 df2.Date 并且 df1.latitude 等于 df2.latitude 并且 df1.longitude 等于 df2.longitude 时获取 'tg' 值,然后将它们添加到 df2.

df1 和 df2 的大小不同。我试过了:

df3 = df1[df1.latitude.isin(df2.latitude_rr) & df1.longitude.isin(df2.longitude_rr) & df1.Date.isin(df2.Date)].tg

我试图将它添加到 df2 但由于 df2 大于 df1 ,它会导致错误的匹配。

我是 Pandas 的新手,因此非常感谢任何帮助。谢谢!

【问题讨论】:

  • 如果它们的大小不同,您有什么唯一标识可以比较它们?是否有可以比较两个数据帧的id 字段?
  • 唯一的标识是日期、经度和纬度。
  • @ansev。没有在这里合并那么简单。

标签: python pandas dataframe


【解决方案1】:

如果足够,请使用df.merge

out = df1.merge(df2.rename(columns={'latitude_rr': 'latitude', 
                                    'longitude_rr': 'longitude'}),
                on=['Date', 'latitude', 'longitude'])
print(out)

# Output
        Date  longitude    tg  latitude    Runoff   rr
0 1984-01-01     13.875  5.34    49.125  0.380845  0.0
1 1984-01-02     13.875  2.56    49.125  0.380845  0.0
2 1984-01-03     13.875  4.02    49.125  0.676056  2.8
3 1984-01-04     13.875 -0.07    49.125  1.464789  2.2
4 1984-01-05     13.875 -2.26    49.125  2.456338  0.4

如果还不够,可以使用KDTree。这个answer可以帮到你。


首先仅通过 date 合并您的 2 个数据帧,因为合并 latitudelongitude(浮点精度)不是一个好选择。您需要像 np.close 这样的函数来匹配坐标:

out = df1.merge(df2, on='Date')

m1 = np.isclose(out['latitude'], out['latitude_rr'], atol=0.00001)
m2 = np.isclose(out['longitude'], out['longitude_rr'], atol=0.00001)
out = out[m1 & m2]

你必须调整公差atol

【讨论】:

  • 我对不同的纬度和经度有相同的日期序列。我得到一个 MemoryError: Unable to allocate 1.93 GiB for an array with shape (259324578,) and data type int64 尝试合并时。
  • 请用大量样本更新您的帖子。 print(df1.head(5).to_dict())print(df2.head(5).to_dict())
  • 也许你应该使用KDTree。看stackoverflow.com/a/67134845/15239951
  • 帖子更新了!我去看看 KDTree。
  • 我更新了我的答案。请检查一下好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 2016-02-03
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多