python - 通过字符串前缀加入 Pandas 数据帧

标签 python pandas join string-matching

我正在寻找一种有效的方法来对两个 pandas.DataFrames 执行以下连接:

第一个包含在 A 列中的字符串如下:

A  ....

Spam|One
Spam|Two
Ham
Eggs

第二个是引用表,以字符串键为索引,有文字说明:

index      description
Spam       "..."
Ham        "..." 
Eggs       "...."
BakedBeans "...."

索引中的每个键都可以是A 中字符串的前缀。现在我想将描述列连接到 A 列,其中 A 中的值与前缀匹配。我有一种感觉,它有一个高效的 p​​andas one-liner...

我们可以假设 A 中的所有值都具有“prefix|suffix”或“prefix”格式。也许这可以加快速度。

最佳答案

使用Series.str.split选择列表的第一个值和 Series.map系列:

print (df1)
          A
0  Spam|One
1  Spam|Two
2       Ham
3      Eggs

print (df2)  
     description
Spam         aaa
Ham           sd
Eggs         rty

print (df2.index)
Index(['Spam', 'Ham', 'Eggs'], dtype='object')

df1['description'] = df1['A'].str.split('|').str[0].map(df2['description'])
print (df1)
          A description
0  Spam|One         aaa
1  Spam|Two         aaa
2       Ham          sd
3      Eggs         rty

更通用的解决方案应该是Series.str.extract , ^ 用于提取起始字符串,join| 用于正则表达式 ORdf2.index:

pat = '(' + '|'.join('^' + df2.index) + ')'
df1['new'] = df1['A'].str.extract(pat,expand=False).map(df2['description'])

关于python - 通过字符串前缀加入 Pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207373/

相关文章:

mysql - SQL选择字段使用另一个表中其他字段的一部分

MySQL 叉积排除对称结果

python - 为什么 int(maxint) 给出的是 long,而 int(int(maxint)) 给出的是 int?这是 NumPy 错误吗?

python - 命名列表列表中的元素是一个好的命名约定吗?

python - 在 Pandas DataFrame 中分隔值高于特定阈值的连续区域

python - 如何使用 pandas DataFrame 绘图函数为每个子图绘制一个 ylabel

python - python 中将此列表更改为另一个列表的功能方法

python - 基于不同的 DataFrame 在 pandas DataFrame 中追加列

python - 按 pandas 列对比率进行分组

MYSQL - 选择表 A 中的值,其中表 B 中的所有对应值都具有特定值