有条件地对齐两个数据帧,以便导出作为 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
我来自 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