'объединить' 2 кадра данных с элементами из списка? - PullRequest
2 голосов
/ 20 июня 2019

Я хочу сделать следующее слияние (сложно описать словами): Это мои датафреймы

df8=pd.DataFrame({'names':[['Hans','Meier'],['Debby','Harry','Peter']]})
    names
 0 ['Hans','Meier']
 1 ['Debby','Harry','Peter']

df9=pd.DataFrame({'caller':['Hans','Meier','Debby','Harry','Peter'],'text':[['hi im hans'],['hi im meier'],['hi im debby'],['hi im harry'],['hi im peter']]})
df9.set_index(df9.caller, inplace = True)
df9.drop('caller', axis = 1, inplace = True)

 caller     text
 Hans        ['hi im hans']
 Meier       ['hi im meier']
 .
 .
 .

Результат должен выглядеть следующим образом

      names                  content
0 ['Hans','Meier']          ['hi im hans', 'hi im meier']
1 ['Debby','Harry','Peter'] ['hi im debby', 'hi im harry', 'hi im peter']

Так что тексты, сказанные людьми в df9, появятся в df8, если этот человек является элементом списка соответствующих имен.

я думаю, что этот вопрос похож на этот но я не вижу решения там

Я заглянул в документацию pandas о сцеплении, объединении и объединении, но также не нашел там решения

Ответы [ 4 ]

6 голосов
/ 20 июня 2019

Вот один из способов

df9['text']=df9['text'].str[0]

l=[df9.loc[x,'text'].tolist() for x in df8.names]
Out[505]: [['hi im hans', 'hi im meier'], ['hi im debby', 'hi im harry', 'hi im peter']]

df9['cont']=l
5 голосов
/ 20 июня 2019

Использование s.get:

d=df9.set_index('caller')['text']
df8=df8.assign(content=df8.names.apply(lambda x:[d.get(i) for i in x]))
print(df8)

                   names                                        content
0          [Hans, Meier]                  [[hi im hans], [hi im meier]]
1  [Debby, Harry, Peter]  [[hi im debby], [hi im harry], [hi im peter]]
5 голосов
/ 20 июня 2019

Вы можете посмотреть значения в df9:

df8['contents'] = df8['names'].apply(lambda l: [df9['text'].loc[name] for name in l])
0 голосов
/ 20 июня 2019

df8['content']= df8['names'].apply(lambda x: [df9.loc[name,'text'][0] for name in x])

Возвращает ошибку, если имя не найдено в df9.Вы можете сделать его более надежным с помощью

df8['content']= df8['names'].apply(lambda x: [df9['text'].get(name)[0] if df9['text'].get(name) else None for name in x])

. В нем будет список, содержащий текст для каждого найденного имени и None для любого имени, не найденного.

Если все, что вы используете df9 - это справочная таблица, то было бы более целесообразно сохранить ее в виде словаря, в этом случае это будет

df8['content']= df8['names'].apply(lambda x: [my_dict.get(name)[0] if my_dict.get(name) else None for name in x])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...