【问题标题】:Search keyword of single column between 2 different dataframes and merge matched rows在2个不同的数据框之间搜索单列的关键字并合并匹配的行
【发布时间】:2022-01-19 22:15:29
【问题描述】:

您好,我是 python 和 pandas 数据帧的新手,我一直坚持以下问题:

我有两个不同的数据框:df1 有 ~130 行,df2 有 ~380 行

  • df1['Symbol_1'] 的值如“DASHUSDT”(例如)包含关键字“DASH”
  • df2['Symbol_2'] 的值类似于 df2 中的“DASHBTC”(例如),其中包含关键字“DASH”

我想从 df1 中按关键字搜索 df2,并创建一个新的数据框(如下所示的 df3)。

  • 请注意,df1 中的所有行将始终具有与 df2 匹配的关键字,“BTC/USDT”对除外。
  • 为了让事情更清楚:Symbol_1(例如:DASHUSDT)总是以'USDT'结尾,'DASH'是关键字。 Symbol_2(例如:DASHBTC)始终以“BTC”结尾,“DASH”是关键字。
  • 我正在为 USDT 货币对创建一个关注列表,并且我想轻松地从同一关注列表中检查 BTC 对。 BTC 为王,所有山寨币都有 BTC 对,DASH/BTC,ETH/BTC,LTC/BTC 等。但 BTC 不会有像 BTC/BTC 这样的 BTC 对,所以对于 'BTC/USDT' 行,第二个数据帧中不会有任何匹配的行,因此我们可以将其保留为空或将“Symbol_2”列替换为“0”,将“24H_Change_2”列替换为“0”

[df1]

Symbol_1       Price    24H_Change_1  Volume

BTCUSDT        42135.15   -1.565      200.125
DASHUSDT       139.87     10.0390     1.7400
ADAUSDT        1.23060    1.0700      1.1800
C98USDT        2.5328     0.4520      1.1900
1000SHIBUSDT   0.029233   6.589       2.4564

[df2]

Symbol_2        24H_Change_2  

1000SHIBBTC     4.412
SNMBTC          5.1235    
ADABTC          1.0700     
XVGBTC          15.1240
C98BTC          0.4520
SALTBTC         7.149
EOSBTC          5.551
DASHBTC         11.258

我想要的输出数据框:(第一个选项)

Symbol_1        Price      24H_Change_1   Volume    Symbol_2      24H_Change_2

BTCUSDT         42135.15   -1.565         200.125   
DASHUSDT        139.87     10.0390        1.7400    DASHBTC       11.258
ADAUSDT         1.23060    1.0700         1.1800    ADABTC        1.0700
C98USDT         2.5328     0.4520         1.1900    C98BTC        0.4520
1000SHIBUSDT    0.029233   6.589          2.4564    1000SHIBBTC   4.412

我想要的输出数据框:(第二个选项)

如果第一个选项是不可能的或太麻烦或两个复杂的完成,我对第二个选项很好,我可以将“BTC/USDT”对从第一个数据帧中分离出来作为一个单一的数据帧供参考,然后添加用于山寨币的新数据帧(如下所示的第三个数据帧)。

Symbol        Price      24H_Change   Volume 

BTCUSDT       42135.15   -1.565       200.125

Symbol_1        Price      24H_Change_1   Volume    Symbol_2      24H_Change_2
  
DASHUSDT        139.87     10.0390        1.7400    DASHBTC       11.258
ADAUSDT         1.23060    1.0700         1.1800    ADABTC        1.0700
C98USDT         2.5328     0.4520         1.1900    C98BTC        0.4520
1000SHIBUSDT    0.029233   6.589          2.4564    1000SHIBBTC   4.412

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

解决方案:

  1. 首先使用字符串替换操作来获取您的“发件人”货币/代币列
  2. 然后将 df1、df2 与 pandas merge 合并。

您做得太难了,您不需要保留监视列表,只需索引两个数据框即可。 (df1中会缺少df2中的一些索引标签,自动合并句柄,见下文。)

假设您知道df1['Symbol_1'] 总是以“...USDT”结尾,而df2['Symbol_2'] 总是以“...BTC”结尾,只需使用简单的字符串替换创建一个新索引或“From”列即可消除目标货币/代币,因此:“BTC”、“DASH”、“ADA”。

df1 = df1.set_index(df1['Symbol_1'].str.replace('(.*)USDT', r'\1', regex=True))

请注意,我们使用regex capture group,因此替换表达式中的r'\1' 与模式中的(.*) 匹配。

同上 df2。

然后您可以简单地使用 df1.merge(df2, ...) 创建 df3 请参阅merge(..., how='left'/'right'/'outer'/'inner') 上的文档以确定您想要哪种类型的合并;我认为您需要“外部”。 (如果您卡在合并语法上,请编辑您的问题以更新它) 鉴于 df1 有 ~130 行但 df2 有 ~380 行,您将获得 NaN 行。请参阅fillna() 上的 .doc。

【讨论】:

  • 非常感谢 smci 的解决方案。
【解决方案2】:

以下是完整的解决方案:

# add the keyword as index value to df1
df1 = df1.set_index(df1['Symbol_1'].str.replace('(.*)USDT', r'\1', regex=True))

# add the exact keyword as index value to df2
df2 = df2.set_index(df2['Symbol_2'].str.replace('(.*)BTC', r'\1', regex=True))

now both dataframes share the same index value

# set default index name for df1 to 'Key'
df1.index.name = 'Key'

# set default index name for df2 to 'Key'
df2.index.name = 'Key'

# merge df2 to df1 (search both dataframes' column name = 'Key' that share the same value, add the columns from the returned rows to df1)
df3 = df1.merge(df2, on='Key')

# drop the default index column and re-index with number
df_reindexed=df3.reset_index(drop=True)

# finally, rename the column names if you want, it's easy to do that.

再次感谢 smci 的解决方案。

然后您可以简单地使用 df1.merge(df2, ...) 创建 df3 参见 关于合并(...,how='left'/'right'/'outer'/'inner')的文档 找出你想要的合并类型;我认为您需要“外部”。 (如果 你被合并语法卡住了,编辑你的问题来更新它) 鉴于 df1 有 ~130 行但 df2 有 ~380 行,您将获得 NaN 行。 请参阅 fillna() 上的 .doc。

smci,df1 有 130 行,df2 有 380 行,我只需要 df2 的 130 行。所以根本不会有任何 NaN 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2016-03-25
    • 2016-07-14
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多