python - 根据条件提取列值
问题描述
我有以下数据框
df = pd.DataFrame({
'Column_1': ['Position', 'Start', 'End', 'Position'],
'Original_1': ['Open', 'Barn', 'Grass', 'Bubble'],
'Latest_1': ['Shut', 'Horn', 'Date', 'Dinner'],
'Column_2': ['Start', 'Position', 'End', 'During'],
'Original_2': ['Sky', 'Hold', 'Car', 'House'],
'Latest_2': ['Pedal', 'Lap', 'Two', 'Force'],
'Column_3': ['Start', 'End', 'Position', 'During'],
'Original_3': ['Leave', 'Dog', 'Block', 'Hope'],
'Latest_3': ['Sear', 'Crawl', 'Enter', 'Night']
})
对于单词 Position 在“Column_1”、“Column_2”或“Column_3”中的每个实例,我想捕获“Original_1”、“Original_2”、“Original_3”中的关联值并将它们分配给名为“原始值'。
下面的代码可以做到这一点,但只能在逐列的基础上。
df['Original_Value1'] = df.loc[df['Column_1'] == 'Position', 'Original_1']
df['Original_Value2'] = df.loc[df['Column_2'] == 'Position', 'Original_2']
df['Original_Value3'] = df.loc[df['Column_3'] == 'Position', 'Original_3']
有没有办法重新创建上面的代码,以便它遍历整个数据框(而不是通过指定的列)?
我希望创建一列('Original_values'),结果如下:
0 Open
1 Hold
2 Block
3 Bubble
Name: Original_Values, dtype: object
解决方案
一种方法是使用df.apply():
def choose_orig(row):
if row['Column_1'] == 'Position':
return row['Original_1']
elif row['Column_2'] == 'Position':
return row['Original_2']
elif row['Column_3'] == 'Position':
return row['Original_3']
return ''
df['Original_Values'] = df.apply(choose_orig, axis=1)
的axis=1
参数df.apply()
导致choose_orig()
函数为数据帧的每一行调用一次。
请注意''
,当没有任何列与单词匹配时,这使用空字符串的默认值'Position'
。
推荐阅读
- openresty - openresty为什么访问根目录时access_by_lua_file调用两次
- python - RuntimeWarning:使用curve_fit时exp中遇到溢出
- laravel - 从 Laravel 中删除未使用的 npm 和 composer 包的最佳方法是什么
- python - 模拟一个 api 响应
- python - 如何在 python 脚本中验证云上的谷歌视觉 API?
- node.js - Angular 7,服务器发送事件未接收事件/数据
- python - 代码帮助,如何删除/跳过列表中的项目?
- java - 来自 resultSet 的 Java getString 在第一个空格处截断字符串或在 '' 内获取子字符串
- python - 如何在使用 matplotlib 绘制 geopandas 数据框时添加额外的点位置
- ios - App Transfer Keychain Loss:用户注销的解决方案