【问题标题】:Pandas Dataframe add column with lambda functionPandas Dataframe 添加具有 lambda 函数的列
【发布时间】:2020-10-16 08:26:58
【问题描述】:

我正在尝试使用随机生成的两个大写字母代码向我的 Pandas Dataframe 添加一列。对于随机代码生成,我编写了一个函数,但是当我将它添加到数据帧时,它只给了我 NaN 作为结果。知道如何解决这个问题吗?

import pandas as pd
import random
import string

def generateCode():
    return random.choice(string.ascii_uppercase) + random.choice(string.ascii_uppercase)

cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
        'Price': [22000,25000,27000,35000]
        }
df = pd.DataFrame(cars, columns = ['Brand', 'Price'])

df['Code'] = df.apply(lambda x: generateCode())

print(df)

给出输出:

            Brand  Price Code
0     Honda Civic  22000  NaN
1  Toyota Corolla  25000  NaN
2      Ford Focus  27000  NaN
3         Audi A4  35000  NaN

感谢任何帮助!

【问题讨论】:

  • 只需添加df['Code'] = df.apply(lambda x: generateCode(), axis=1)

标签: python python-3.x pandas dataframe lambda


【解决方案1】:

使用Series.apply 处理每个值:

df['Code'] = df['Brand'].apply(lambda x: generateCode())

print(df)
            Brand  Price Code
0     Honda Civic  22000   AY
1  Toyota Corolla  25000   EN
2      Ford Focus  27000   VN
3         Audi A4  35000   ZZ

DataFrame.applyaxis=1 用于每行处理:

df['Code'] = df.apply(lambda x: generateCode(), axis=1)

print(df)
            Brand  Price Code
0     Honda Civic  22000   AY
1  Toyota Corolla  25000   EN
2      Ford Focus  27000   VN
3         Audi A4  35000   ZZ

【讨论】:

    【解决方案2】:

    不要问我为什么,但这确实有效:

    import pandas as pd
    import random
    import string
    
    def generateCode():
        print(random.choice(string.ascii_uppercase) + random.choice(string.ascii_uppercase))
        return random.choice(string.ascii_uppercase) + random.choice(string.ascii_uppercase)
    
    cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
            'Price': [22000,25000,27000,35000]
            }
    df = pd.DataFrame(cars, columns = ['Brand', 'Price'])
    
    df['Code'] = df.Brand.map(lambda x: generateCode())
    
    print(df)
    

    如果有人能解释为什么会这样,我将不胜感激

    【讨论】:

    • 实际上我一直在进行一些打印,我认为问题在于您没有指定一列,因此它返回一整行而不是每个行值的序列。 df.Brand.apply(lambda x: generateCode()),顺便说一句也有效
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 2017-08-09
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2018-08-13
    • 2022-11-10
    相关资源
    最近更新 更多