python - 创建一个以函数为条件的 Pandas 数据框列
问题描述
假设我有一些如下所示的数据框,我创建了一个新列 ( track_len
),它给出了列的长度track_no
。
import pandas as pd
df = pd.DataFrame({'item_id': [1,2,3], 'track_no': ['qwerty23', 'poiu2', 'poiuyt5']})
df['track_len'] = df['track_no'].str.len()
df.head()
我的问题是:
我现在如何创建一个新列 ( new_col
),它选择字符串的特定子集track_no
并根据轨道号 ( track_len
) 的长度输出该子集。
我尝试创建一个函数,该函数输出 track_no
给定各种track_len
条件的特定字符串切片,然后使用 apply 方法创建列,但它不起作用。代码如下:
试过:
def f(row):
if row['track_len'] == 8:
val = row['track_no'].str[0:3]
elif row['track_len'] == 5:
val = row['track_no'].str[0:1]
elif row['track_len'] =7:
val = row['track_no'].str[0:2]
return val
df['new_col'] = df.apply(f, axis=1)
df.head()
因此所需的输出应该是(基于 f 的字符串切片输出):
输出
{new_col: ['qwe', 'p', 'po']}
如果有其他更好的解决方案来解决这个问题,我们也将不胜感激。
解决方案
您的功能运行良好,您需要删除 if 块中的 .str 部分。值已经是字符串:
def f(row):
if row['track_len'] == 8:
val = row['track_no'][:3]
elif row['track_len'] == 5:
val = row['track_no'][:1]
elif row['track_len'] ==7:
val = row['track_no'][:2]
return val
df['new_col'] = df.apply(f, axis=1)
df.head()
#Output:
item_id track_no track_len new_col
0 1 qwerty23 8 qwe
1 2 poiu2 5 p
2 3 poiuyt5 7 po
推荐阅读
- javascript - 如何更改网站上的滚动行为(例如速度、加速度)?
- charts - 如何可视化投资组合资产中的交易
- python - 如何在 Python 中加载图像,但保持压缩?
- android - 模拟器上的布局显示错误
- c# - 是否可以使用带有 ExceptionHandler 选项的 UseExceptionHandler() 来配置“专门处理 web api 请求”?
- firebase - 首次登录的 Flutter-Firebase 文档条目
- python - word2vec 向量的 Keras 输入规范
- python - 如何从 DataFrame 中删除跨多个列具有重复字符串的行?
- sql - 使用 group by 时遇到除以零错误
- java - java -AbandonedConnectionCleanupThread 占用更多 CPU 时间