【问题标题】:DataFrame, apply, lambda, list comprehensionDataFrame、apply、lambda、列表理解
【发布时间】:2018-12-13 06:35:28
【问题描述】:

我正在尝试对一些数据集进行一些清理,我可以使用一些 for 循环来完成任务,但我想要一种更 Pythonic/pandorable 的方式来做到这一点。

这是我想出的代码,数据不是真实的..但它应该可以工作

import pandas as pd

# This is a dataframe containing the correct values
correct = pd.DataFrame([{"letters":"abc","data":1},{"letters":"ast","data":2},{"letters":"bkgf","data":3}])

# This is the dataframe containing source data
source = pd.DataFrame([{"c":"ab"},{"c":"kh"},{"c":"bkg"}])

for i,word in source["c"].iteritems():
    for j,row in correct.iterrows():       
        if word in row["letters"]:           
            source.at[i,"c"] = row["data"]    
            break

这是我尝试一种可取的方式,但由于列表理解返回生成器而失败:

source["c"] = source["c"].apply(
lambda x: row["data"] if x in row["letters"] else x for row in 
correct.iterrows() 
)

【问题讨论】:

    标签: python pandas dataframe lambda series


    【解决方案1】:

    这是一种使用 pd.Series.applynext 和生成器表达式的解决方案:

    def update_value(x):
        return next((k for k, v in correct.set_index('data')['letters'].items() if x in v), x)
    
    source['c'] = source['c'].apply(update_value)
    
    print(source)
    
        c
    0   1
    1  kh
    2   3
    

    【讨论】:

      猜你喜欢
      • 2020-02-20
      • 2021-02-24
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多