【问题标题】:Dataframe to Series of lists数据框到一系列列表
【发布时间】:2018-12-10 11:27:10
【问题描述】:

假设我有以下数据框:

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]

【问题讨论】:

  • 但你为什么要这样做?
  • 我需要它来完成一项相当具体的任务。并且想知道是否有相反的方式做.apply(pd.Series),@juanpa.arrivillaga

标签: python python-3.x pandas list dataframe


【解决方案1】:

您可以尝试使用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

【讨论】:

  • 谢谢,很好的解决方案
【解决方案2】:

你可以用这个

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

Out[1]: [[5, 9], [], [2, 1]]

【讨论】:

  • 谢谢@caiobelfort
【解决方案3】:

类似于@jezreal's solution。但是如果你不期望0 值,你可以使用空字符串固有的False-ness:

L = [x[x.astype(bool)].tolist() for i, x in df.T.items()]
res = pd.Series(L, index=df.index)

【讨论】:

  • 如果值中没有 0 则解决方案有效,我同意。所以不能用于一般数据,不幸的是......
  • @jezrael,当然。如果不期望 0 数据,则与空字符串相比,此解决方案对于大型数据集的效率大约提高 1.5 倍。因此,对于边缘情况和未来的访问者,值得注意。
  • 在这种情况下也可能有 '0'。无论如何谢谢,并同意它在其他情况下可能有用
【解决方案4】:

可以按如下方式进行:

# 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 个值 :(
  • 好吧,牺牲了优雅。
【解决方案5】:

使用列表推导删除空值:

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

【讨论】:

    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 2020-09-13
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多