首页 > 解决方案 > 创建一个以函数为条件的 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']}

如果有其他更好的解决方案来解决这个问题,我们也将不胜感激。

标签: pythonpandasdataframeif-statement

解决方案


您的功能运行良好,您需要删除 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


推荐阅读