gpt4 book ai didi

python - 高效连接忽略索引中的后缀

转载 作者:行者123 更新时间:2023-11-28 22:24:53 25 4
gpt4 key购买 nike

我确实有两个这样的数据框:

import pandas as pd

df1 = pd.DataFrame({"c1": range(5), "c2": range(1, 6)}, index=list("ABCDE"))
df2 = pd.DataFrame({"c3": range(15, 21), "c4": range(11, 17)}, index=["A_suf1", "B_suf2", "A_suf2", "C_suf2", "B_suf1", "D_suf1"])

c1 c2
A 0 1
B 1 2
C 2 3
D 3 4
E 4 5

c3 c4
A_suf1 15 11
B_suf2 16 12
A_suf2 17 13
C_suf2 18 14
B_suf1 19 15
D_suf1 20 16

我想变成

       c3  c4  c1
A_suf1 15 11 0
B_suf2 16 12 1
A_suf2 17 13 0
C_suf2 18 14 2
B_suf1 19 15 1
D_suf1 20 16 3

因此,我想在 df2 的索引中连接独立于后缀 suf1suf2 的数据帧。由于 df1c1A 列的条目为 0,因此它应该出现在条目 A_suf1< 的串联数据框中A_suf2

我目前的实现方式如下:

# store original name of index
old_index = df2.index
# temporary column which creates values which are in the the index of df1
df2['helper'] = df2.reset_index()["index"].apply(lambda x: x.split("_")[0]).tolist()
# prepare concat
df2 = df2.set_index("helper")
# concat
df_final = pd.concat([df2, df1.loc[:, "c1"]], join="inner", axis=1)
# reset index to original values
df_final.index = old_index

这给了我想要的输出。

但是,它需要一个相当慢的apply,如果 df2 中有一个索引条目,而 df1 中没有,它也会失败.例如,上面的代码对于 df2 equals

将失败
df2 = pd.DataFrame({"c3": range(15, 22), "c4": range(11, 18)}, index=["A_suf1", "B_suf2", "A_suf2", "C_suf2", "B_suf1", "D_suf1", "F_suf1"])

c3 c4
A_suf1 15 11
B_suf2 16 12
A_suf2 17 13
C_suf2 18 14
B_suf1 19 15
D_suf1 20 16
F_suf1 21 17

因此,问题是是否有更有效和更通用的解决方案分别适用于工作和非工作情况。

最佳答案

使用join通过 MultiIndex 创建了 df2 的拆分 indexreindex对于 df1Multiindex:

df2.index = df2.index.str.split('_', expand=True)
print(df2)
c3 c4
A suf1 15 11
B suf2 16 12
A suf2 17 13
C suf2 18 14
B suf1 19 15
D suf1 20 16

print (df1['c1'].reindex(df2.index,level=0))
A suf1 0
B suf2 1
A suf2 0
C suf2 2
B suf1 1
D suf1 3
Name: c1, dtype: int32

df = df2.join(df1['c1'].reindex(df2.index,level=0))
#convert MultiIndex to index
df.index = df.index.map('_'.join)
print (df)
c3 c4 c1
A_suf1 15 11 0
B_suf2 16 12 1
A_suf2 17 13 0
C_suf2 18 14 2
B_suf1 19 15 1
D_suf1 20 16 3

对于另一个 df2 得到:

print (df)
c3 c4 c1
A_suf1 15 11 0.0
B_suf2 16 12 1.0
A_suf2 17 13 0.0
C_suf2 18 14 2.0
B_suf1 19 15 1.0
D_suf1 20 16 3.0
F_suf1 21 17 NaN

关于python - 高效连接忽略索引中的后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46025932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com