有条件地对齐两个数据帧,以便导出作为 numpy 条件传入的列,其中

Conditionally align two dataframes in order to derive a column passed in as a condition in numpy where

我来自 SQL 背景并且是 python 的新手。一段时间以来,我一直在试图弄清楚如何解决这个特殊问题,但我什么也想不出。

这是我的数据帧

from pandas import DataFrame
import numpy as np

Names1 = {'First_name': ['Jon','Bill','Billing','Maria','Martha','Emma']}
df = DataFrame(Names1,columns=['First_name'])
print(df)

names2 = {'name': ['Jo', 'Bi', 'Ma']}
df_2 = DataFrame(names2,columns=['name'])
print(df_2)

结果:

   First_name
0        Jon
1       Bill
2    Billing
3      Maria
4     Martha
5       Emma
  name
0   Jo
1   Bi
2   Ma

此代码帮助我在 df 中识别哪个 First_name 以来自 df_2

的元组开头
df['like_flg'] = np.where(df['First_name'].str.startswith(tuple(list(df_2['name']))), 'true', df['First_name'])

结果:

First_name  like_flg
0   Jon     true
1   Bill    true
2   Billing true
3   Maria   true
4   Martha  true
5   Emma    Emma

我希望数据帧的最终输出将 like_flg 设置为与 First_name 字段有条件比较的元组的值。请参阅下面的最终所需输出:

First_name  like_flg
0   Jon     Jo
1   Bill    Bi
2   Billing Bi
3   Maria   Ma
4   Martha  Ma
5   Emma    Emma

这是我到目前为止尝试过的方法

df['like_flg'] = np.where(df['First_name'].str.startswith(tuple(list(df_2['name']))), tuple(list(df_2['name'])), df['First_name'])

导致此错误:

`ValueError: operands could not be broadcast together with shapes (6,) (3,) (6,)` 

我也尝试过对齐两个数据帧,但是,这不适用于我试图实现的用例。

有没有办法有条件地对齐数据框以填充以元组开头的列?

我认为我面临的问题是我用作比较的元组或数据框与我要将元组附加到的数据框大小不同。请参阅上面的所需输出。

谢谢大家提前!

您可以使用np.where,

df['like_flg'] = np.where(df.First_name.str[:2].isin(df_2.name), df.First_name.str[:2], df.First_name)

    First_name  like_flg
0   Jon         Jo
1   Bill        Bi
2   Billing     Bi
3   Maria       Ma
4   Martha      Ma
5   Emma        Emma

如果您的起始字符串长度不同,您可以使用 .str.extract

df['like_flag'] = df['First_name'].str.extract('^('+'|'.join(df_2.name)+')')
df['like_flag'] = df['like_flag'].fillna(df.First_name)  # Fill non matches.

我修改df_2

  name
0   Jo
1   Bi
2  Mar

这导致:

  First_name like_flag
0        Jon        Jo
1       Bill        Bi
2    Billing        Bi
3      Maria       Mar
4     Martha       Mar
5       Emma      Emma

numpy find

一起做
v=df.First_name.values.astype(str)
s=df_2.name.values.astype(str)

df_2.name.dot((np.char.find(v,s[:,None])==0))
array(['Jo', 'Bi', 'Bi', 'Ma', 'Ma', ''], dtype=object)

然后我们把它赋值回来

df['New']=df_2.name.dot((np.char.find(v,s[:,None])==0))
df.loc[df['New']=='','New']=df.First_name
df
  First_name   New
0        Jon    Jo
1       Bill    Bi
2    Billing    Bi
3      Maria    Ma
4     Martha    Ma
5       Emma  Emma