DataFrame, применять, лямбда, список понимания - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь немного очистить некоторые наборы данных, я могу выполнить задачу с помощью некоторых циклов for, но мне нужен более питонический / изумительный способ сделать это.

Это код, который я придумал, данные не настоящие ... но это должно работать

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() 
)

1 Ответ

0 голосов
/ 04 июля 2018

Вот одно решение, использующее pd.Series.apply с next и выражение генератора:

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
...