Панды: конвертировать Nan в ряд в пустой массив - PullRequest
0 голосов
/ 29 ноября 2018

Мои кадры данных как показано ниже

df1

id   c1
1    abc
2    def
3    ghi

df2

id   set1
1    [123,456]
2    [789]

Когда я присоединяюсь к df1 и df2 (final_data = df1.merge(df2, how = 'left')).Это дает мне

final_df

id   c1   set1
1    abc  [123,456]
2    def  [789]
3    ghi  NaN

Я использую приведенный ниже код для замены NaN на пустой массив []

for row in final_df.loc[final_df.set1.isnull(), 'set1'].index:
        final_df.at[row, 'set1'] = []

Проблема в том, что df2 является пустым фреймом данных,Это дает

ValueError: установка элемента массива с последовательностью.

PS: я использую pandas 0.23.4 version

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Это не идеально, но выполнит вашу работу

import pandas as  pd
import numpy as np
df1 = pd.DataFrame([[1,'abc'],[2,'def'],[3,'ghi']], columns=['id', 'c1'])
df2 = pd.DataFrame([[1,[123,456]],[2,[789]]], columns=['id', 'set1'])
df=pd.merge(df1,df2, how='left', on='id')
df['set1'].fillna(0, inplace=True)
df['set1']=df['set1'].apply( lambda x:pd.Series({'set1': [] if x == 0 else x}))
print(df)
0 голосов
/ 29 ноября 2018

Панды не предназначены для использования с сериями списков.Вы теряете всю векторизованную функциональность, и любые манипуляции с такими сериями связаны с неэффективными циклами уровня Python.

Один из способов - определить серию пустых списков:

res = df1.merge(df2, how='left')

empty = pd.Series([[] for _ in range(len(df.index))], index=df.index)
res['set1'] = res['set1'].fillna(empty)

print(res)

   id   c1        set1
0   1  abc  [123, 456]
1   2  def       [789]
2   3  ghi          []

Лучшая идеяна данный момент, если это целесообразно, это разделить ваши списки на отдельные серии:

res = res.join(pd.DataFrame(res.pop('set1').values.tolist()))

print(res)

   id   c1      0      1
0   1  abc  123.0  456.0
1   2  def  789.0    NaN
2   3  ghi    NaN    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...