包含数组的熊猫系列

Posted

技术标签:

【中文标题】包含数组的熊猫系列【英文标题】:pandas series containing arrays 【发布时间】:2016-06-13 19:52:42 【问题描述】:

我有一个 pandas 数据框列,看起来有点像:

Out[67]:
0      ["cheese", "milk...
1      ["yogurt", "cheese...
2      ["cheese", "cream"...
3      ["milk", "cheese"...

现在,最终我希望将其作为一个平面列表,但在尝试将其展平时,我注意到 pandas 将 ["cheese", "milk", "cream"] 视为 str 而不是 list

我将如何解决这个问题,所以我最终得到:

["cheese", "milk", "yogurt", "cheese", "cheese"...]

[编辑] 所以下面给出的答案似乎是:

s = pd.Series(["['cheese', 'milk']", "['yogurt', 'cheese']", "['cheese', 'cream']"])

s = s.str.strip("[]")
df = s.str.split(',', expand=True)
df = df.applymap(lambda x: x.replace("'", '').strip())
l = df.values.flatten()
print (l.tolist())

这很好,回答了问题,接受了答案,但我觉得它是一个相当不雅的解决方案。

【问题讨论】:

python pandas flatten a dataframe to a list的可能重复 不,它不是重复的,因为列的typestring 而不是list 【参考方案1】:

你可以使用numpy.flatten,然后平面嵌套lists - see:

print df
                  a
0    [cheese, milk]
1  [yogurt, cheese]
2   [cheese, cream]

print df.a.values
[[['cheese', 'milk']]
 [['yogurt', 'cheese']]
 [['cheese', 'cream']]]

l = df.a.values.flatten()
print l
[['cheese', 'milk'] ['yogurt', 'cheese'] ['cheese', 'cream']]

print [item for sublist in l for item in sublist]
['cheese', 'milk', 'yogurt', 'cheese', 'cheese', 'cream']

编辑:

你可以试试:

import pandas as pd

s = pd.Series(["['cheese', 'milk']", "['yogurt', 'cheese']", "['cheese', 'cream']"])

#remove []
s = s.str.strip('[]')
print s
0      'cheese', 'milk'
1    'yogurt', 'cheese'
2     'cheese', 'cream'
dtype: object

df = s.str.split(',', expand=True)
#remove ' and strip empty string
df = df.applymap(lambda x: x.replace("'", '').strip())
print df
        0       1
0  cheese    milk
1  yogurt  cheese
2  cheese   cream

l = df.values.flatten()
print l.tolist()
['cheese', 'milk', 'yogurt', 'cheese', 'cheese', 'cream']

【讨论】:

我认为df.values.a.flatten() 有错字,应该改成df.a.values.flatten() 这只是为我打印每个单独的字母:s = pd.Series(["['cheese', 'milk']", "['yogurt', 'cheese']", "['cheese', 'cream']"])l = s.values.flatten()print ([item for sublist in l for item in sublist]) 嗯,我不能否认它有效,所以谢谢。虽然答案如此笨拙,但我有点惊讶【参考方案2】:

您可以将Series 转换为DataFrame,然后调用stack

s.apply(pd.Series).stack().tolist()

【讨论】:

返回一个包含 ['milk', 'cheese'] s = pd.Series(["['cheese', 'milk']", "['yogurt', 'cheese']", "['cheese', 'cream']"]) s.apply(pd.Series).stack().tolist()的字符串列表 从最初的描述来看,我认为Series的类型是一个字符串列表:s2 = pd.Series([['cheese', 'milk'], ['yogurt', 'cheese'], ['cheese', 'cream']]),在这种情况下s2.apply(pd.Series).stack().tolist()应该可以工作。如果Series 的类型是表示字符串列表的字符串,则可以添加 eval:s.apply(lambda x: pd.Series(eval(x))).stack().tolist()【参考方案3】:

要将列值从 str 转换为 list,您可以使用 df.columnName.tolist(),而对于展平,您可以使用 df.columnName.values.flatten()

【讨论】:

以上是关于包含数组的熊猫系列的主要内容,如果未能解决你的问题,请参考以下文章

如何从一系列数组构造熊猫数据框

如何获得熊猫系列的元素逻辑非?

如何获得熊猫系列的元素逻辑非?

将熊猫系列转换为numpy数组[重复]

熊猫布尔系列不会绘图

来自数据框的嵌套字典,内部字典包含熊猫系列作为值