python - 如何将 iterrows 下的功能转换为 pandas 中的一行
问题描述
我的data1如下:
[
{"cut_id":1,"cut_label":"v024","cut_name":"State","value_label":"1","value":"andaman and nicobar islands"},
{"cut_id":3,"cut_label":"v024","cut_name":"State","value_label":"3","value":"arunachal pradesh"},
{"cut_id":635,"cut_label":"sdistri","cut_name":"District","value_label":"599","value":"pathanamthitta"},
{"cut_id":636,"cut_label":"sdistri","cut_name":"District","value_label":"600","value":"kollam"},
{"cut_id":637,"cut_label":"sdistri","cut_name":"District","value_label":"601","value":"thiruvananthapuram"}
]
我想要的输出如下:
[
{"value_label":"S1","value":"andaman and nicobar islands"},
{"value_label":"S3","value":"arunachal pradesh"},
{"value_label":"D599","value":"pathanamthitta"},
{"value_label":"D600","value":"kollam"},
{"value_label":"D601","value":"thiruvananthapuram"}
]
我的意图是重命名值标签,根据它是州还是地区,在数字后面加上一个字符“S”或“D”。
这是我的代码:
for _, r in data[
(data['cut_name'] == 'State') | (data['cut_name'] == 'District')][
['cut_name', 'value', 'value_label']
].iterrows():
cuts_data[r.cut_name[0]+r.value_label] = r.value
我得到了预期的结果,但是有没有办法在一行中做到这一点
解决方案
与索引一起使用str
以获取第一个值,cut_name
并在必要时通过以下方式对其进行过滤Series.isin
:
mask = data['cut_name'].isin(['State','District'])
data.loc[mask, 'value_label'] = data['cut_name'].str[0] + data['value_label'].astype(str)
If onlyState
或District
可能的值:
data['value_label'] = data['cut_name'].str[0] + data['value_label'].astype(str)
为了提高性能,可以使用列表理解(工作良好是非缺失值):
data['value_label'] = [c[0] + str(v) for c, v in zip(data['cut_name'], data['value_label'])]
如果需要带有过滤列的新 DataFrame:
new_df = data[['value','value_label']]
推荐阅读
- php - 用于将高级搜索字符串转换为关联数组的包?
- javascript - 在 highcharts 中的饼图和条形图之间切换
- javascript - 边框颜色悬停效果问题
- c# - 在本地时区格式化 UTC 时间戳
- mysql - 从 hive 表中查询数据时,哪种状态最好排除 NULL 和空格
- android - 登录名不匹配。请为此身份或身份池提供至少一个有效登录信息
- java - java.lang.IllegalStateException:连接池关闭异常
- wordpress - 网站重复 - 子网站 Worpress Multisite - 前端注册
- service-worker - ServiceWorker 提供的请求从 HTTP/2 降级到 HTTP/1.1
- javascript - 如何覆盖(或覆盖?)内置 Javascript 函数