Датафрейм в серию списков - PullRequest
       0

Датафрейм в серию списков

0 голосов
/ 10 декабря 2018

Скажем, у меня есть следующий фрейм данных:

df =pd.DataFrame({'col1':[5,'',2], 'col2':['','',1], 'col3':[9,'','']})  
print(df)

col1 col2 col3
       5    9
 1               
 2     2    1     

Есть ли простой способ превратить его в pd.Series списков, избегая пустых элементов?Итак:

0 [5,9]
1 [1]
2 [2,2,1]

Ответы [ 5 ]

0 голосов
/ 10 декабря 2018

Вы можете попробовать использовать df.values ​​

Просто возьмите df.values.Преобразуйте их в список и удалите пустые элементы, используя map:

In [2193]: df
Out[2193]: 
  col1 col2 col3
0         5    9
1    1          
2    2    2    1

Однострочник:

In [2186]: pd.Series(df.values.tolist()).map(lambda row: [x for x in row if x != ''])
Out[2186]: 
0       [5, 9]
1          [1]
2    [2, 2, 1]
dtype: object
0 голосов
/ 10 декабря 2018

Аналогично решению @ jezreal .Но если вы не ожидаете 0 значений, вы можете использовать присущую False -ность пустых строк:

L = [x[x.astype(bool)].tolist() for i, x in df.T.items()]
res = pd.Series(L, index=df.index)
0 голосов
/ 10 декабря 2018

Можно сделать следующим образом:

# Break down into list of tuples
records = df.to_records().tolist()

# Convert tuples into lists
series = pd.Series(records).map(list)

# Get rid of empty strings
series.map(lambda row: list(filter(lambda x: x != '', row)))

# ... alternatively
series.map(lambda row: [x for x in row if x != ''])

, в результате чего

0    [0, 5, 9]
1          [1]
2    [2, 2, 1]
0 голосов
/ 10 декабря 2018

Вы можете использовать это

In[1]: [x[x.apply(lambda k: k != '')].tolist() for i, x in df.iterrows()]

Out[1]: [[5, 9], [], [2, 1]]
0 голосов
/ 10 декабря 2018

Использовать понимание списка с удалением пустого значения:

L = [x[x != ''].tolist() for i, x in df.T.items()]
s = pd.Series(L, index=df.index)

Или преобразовать значения в списки с помощью to_dict с параметром split:

L = df.to_dict(orient='split')['data']
print (L)
[[5, '', 9], ['', '', ''], [2, 1, '']]

А затем удалите пустые значения:

s = pd.Series([[y for y in x if y != ''] for x in L], index=df.index)

print (s)
0    [5, 9]
1        []
2    [2, 1]
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...