如何在pandas DataFrame中将列表列表列更改为常规列表?

时间:2018-11-23 18:27:16

标签: python pandas numpy dataframe sublist

我有一个Pandas DataFrame。其列之一是列表列表。

enter image description here

执行以下操作的最佳方法是什么:

  1. 用单词“其他”填充list_of_lists列中的空列表吗? 例如[]应该成为['other']
  2. 将list_of_lists列更改为常规分类列表?它应该最终看起来像这样……

enter image description here

3 个答案:

答案 0 :(得分:1)

有很多原因不应该在Pandas系列对象中使用列表。您的第一个调用端口应该是提取字符串并将系列转换为分类数据:

df = pd.DataFrame({'A': [[], ['steel'], ['steel'], [], ['tarmac'], []]})

df['A'] = df['A'].str[0].fillna('other').astype('category')

print(df)

        A
0   other
1   steel
2   steel
3   other
4  tarmac
5   other

如果您坚持通过Python级别的循环使用低效且不可向量化的操作,则可以通过以下方式实现所需的目标:

df['A'] = df['A'].str[0].fillna('other').apply(lambda x: [x])

print(df)

          A
0   [other]
1   [steel]
2   [steel]
3   [other]
4  [tarmac]
5   [other]

在这一点上,无法使用分类数据,因为分类列表不支持一系列列表,因为list不可散列。

答案 1 :(得分:1)

IIUC

df.A=[x if x  else ['other']  for x in df.A  ]
df
Out[298]: 
          A
0   [other]
1   [steel]
2   [steel]
3   [other]
4  [tarmac]
5   [other]

答案 2 :(得分:0)

另一个技巧:

>>> df
          A
0        []
1   [steel]
2   [steel]
3        []
4  [tarmac]
5        []

>>> df.A.apply(lambda y: "[other]"  if len(y)==0 else y)
0     [other]
1     [steel]
2     [steel]
3     [other]
4    [tarmac]
5     [other]
Name: A, dtype: object

OR:

  >>> df['A'].apply(lambda x: x if x else ['other'])
0     [other]
1     [steel]
2     [steel]
3     [other]
4    [tarmac]
5     [other]
Name: A, dtype: object