根据其他值将数据框中的值添加到行
Add value in dataframe to row based on other value
我正在寻找一种基于另一个值在数据框中查找值并将查找值添加到具有另一个值的行中的列的高效方法。
例如,我有这个数据框:
import pandas as pd
data = {
'role': ['primary', 'secondary', 'primary', 'secondary'],
'serial_number': ['abc', '123', 'def', '456'],
'primary_serial_number': ['abc', 'abc', 'def', 'def'],
'physical_id': ['w', 'x', 'y', 'z'],
'set_id': ['j', 'x', 'k', 'z']
}
df = pd.DataFrame(data = data)
role serial_number primary_serial_number physical_id set_id
0 primary abc abc w j
1 secondary 123 abc x x
2 primary def def y k
3 secondary 456 def z z
副手总是有相同的 physical_id 和 set_id。对于每个中学,我希望相关小学的 set_id 与中学在同一行中。我可以通过将每个次要的“primary_serial_number”与每个主要的“serial_number”进行匹配来查找。然后我应该有一个标有“primary_set_id”的列,其值为 j、j、k、k。
我尝试了以下方法:
df['primary_set_id'] = df['primary_serial_number'].apply(
lambda x: df['set_id'][df['serial_number'] == x])
当我 运行 在上面的假数据上这样做时,我得到:
ValueError: Wrong number of items passed 2, placement implies 1
现实中,我处理的是几十万行,这种方法效率极低(我还没有让它运行完成)。
我认为应该这样做
grps = df.groupby('role')
prim_df = grps.get_group('primary')
sec_df = grps.get_group('secondary')
primsec_df = sec_df.merge(prim_df, left_on = 'primary_serial_number', right_on = 'serial_number')
primsec_df
在第 'sec_id_y'
列中,你得到了你想要的:
| | role_x | serial_number_x | primary_serial_number_x | physical_id_x | set_id_x | role_y | serial_number_y | primary_serial_number_y | physical_id_y | set_id_y |
|---:|:----------|------------------:|:--------------------------|:----------------|:-----------|:---------|:------------------|:--------------------------|:----------------|:-----------|
| 0 | secondary | 123 | abc | x | x | primary | abc | abc | w | j |
| 1 | secondary | 456 | def | z | z | primary | def | def | y | k |
我不确定这在大 df 上的效率如何
我正在寻找一种基于另一个值在数据框中查找值并将查找值添加到具有另一个值的行中的列的高效方法。
例如,我有这个数据框:
import pandas as pd
data = {
'role': ['primary', 'secondary', 'primary', 'secondary'],
'serial_number': ['abc', '123', 'def', '456'],
'primary_serial_number': ['abc', 'abc', 'def', 'def'],
'physical_id': ['w', 'x', 'y', 'z'],
'set_id': ['j', 'x', 'k', 'z']
}
df = pd.DataFrame(data = data)
role serial_number primary_serial_number physical_id set_id
0 primary abc abc w j
1 secondary 123 abc x x
2 primary def def y k
3 secondary 456 def z z
副手总是有相同的 physical_id 和 set_id。对于每个中学,我希望相关小学的 set_id 与中学在同一行中。我可以通过将每个次要的“primary_serial_number”与每个主要的“serial_number”进行匹配来查找。然后我应该有一个标有“primary_set_id”的列,其值为 j、j、k、k。
我尝试了以下方法:
df['primary_set_id'] = df['primary_serial_number'].apply(
lambda x: df['set_id'][df['serial_number'] == x])
当我 运行 在上面的假数据上这样做时,我得到:
ValueError: Wrong number of items passed 2, placement implies 1
现实中,我处理的是几十万行,这种方法效率极低(我还没有让它运行完成)。
我认为应该这样做
grps = df.groupby('role')
prim_df = grps.get_group('primary')
sec_df = grps.get_group('secondary')
primsec_df = sec_df.merge(prim_df, left_on = 'primary_serial_number', right_on = 'serial_number')
primsec_df
在第 'sec_id_y'
列中,你得到了你想要的:
| | role_x | serial_number_x | primary_serial_number_x | physical_id_x | set_id_x | role_y | serial_number_y | primary_serial_number_y | physical_id_y | set_id_y |
|---:|:----------|------------------:|:--------------------------|:----------------|:-----------|:---------|:------------------|:--------------------------|:----------------|:-----------|
| 0 | secondary | 123 | abc | x | x | primary | abc | abc | w | j |
| 1 | secondary | 456 | def | z | z | primary | def | def | y | k |
我不确定这在大 df 上的效率如何