【问题标题】:Pandas: Convert nan in a row to an empty array熊猫:将nan连续转换为空数组
【发布时间】:2019-05-01 09:52:07
【问题描述】:

我的数据框如下所示

df1

id   c1
1    abc
2    def
3    ghi

df2

id   set1
1    [123,456]
2    [789]

当我加入 df1 和 df2 (final_data = df1.merge(df2, how = 'left'))。它给了我

final_df

id   c1   set1
1    abc  [123,456]
2    def  [789]
3    ghi  NaN

我正在使用下面的代码将 NaN 替换为空数组 []

for row in final_df.loc[final_df.set1.isnull(), 'set1'].index:
        final_df.at[row, 'set1'] = []

问题在于 df2 是否为空数据框。它给了

ValueError: 使用序列设置数组元素。

PS:我使用的是 pandas 0.23.4 版本

【问题讨论】:

  • Pandas 并不是真正设计用于处理单个单元格中的集合。 fillna() 不允许我设置一个空数组,我担心存在的任何解决方案都会很麻烦。您应该注意,使用这种结构,您无法获得 numpy/pandas 的所有矢量化特征。

标签: python pandas dataframe


【解决方案1】:

这并不理想,但可以完成您的工作

import pandas as  pd
import numpy as np
df1 = pd.DataFrame([[1,'abc'],[2,'def'],[3,'ghi']], columns=['id', 'c1'])
df2 = pd.DataFrame([[1,[123,456]],[2,[789]]], columns=['id', 'set1'])
df=pd.merge(df1,df2, how='left', on='id')
df['set1'].fillna(0, inplace=True)
df['set1']=df['set1'].apply( lambda x:pd.Series({'set1': [] if x == 0 else x}))
print(df)

【讨论】:

  • 这实际上很容易出错。您依赖于没有 0 值。 OP 已经有混合类型,因为它们有列表和NaN。假设他们在该列中也没有裸 0,这不是一个安全的假设
【解决方案2】:

Pandas 不适合与一系列列表一起使用。您将失去所有矢量化功能,并且对此类系列的任何操作都涉及低效的 Python 级循环。

一种解决方法是定义一系列空列表:

res = df1.merge(df2, how='left')

empty = pd.Series([[] for _ in range(len(df.index))], index=df.index)
res['set1'] = res['set1'].fillna(empty)

print(res)

   id   c1        set1
0   1  abc  [123, 456]
1   2  def       [789]
2   3  ghi          []

如果可行的话,此时一个更好的主意是将您的列表分成单独的系列:

res = res.join(pd.DataFrame(res.pop('set1').values.tolist()))

print(res)

   id   c1      0      1
0   1  abc  123.0  456.0
1   2  def  789.0    NaN
2   3  ghi    NaN    NaN

【讨论】:

  • 我要将该数据帧转换为 JSON。所以我会得到它 [{ "id" : 1, "c1" : "abc", "set1" : [123,456] },{ "id" : 3, "c1" : "ghi", "set1" : [] }]
  • @HemanthS.Vaddi,好的,这是一个不同的新问题。您应该 ask a separate question 了解构建 json 的最有效方式。
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 2021-05-08
  • 2019-04-04
  • 1970-01-01
  • 2015-08-04
  • 2020-12-06
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多