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

How do I change a list of lists column into a regular list in a pandas DataFrame?

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

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

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

您不应该在 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 不可哈希。

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]

另一个技巧:

>>> 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

或:

  >>> 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