熊猫:将nan连续转换为空数组

时间:2018-11-29 10:47:25

标签: python pandas dataframe

我的数据框如下所示

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:我使用的是熊猫0.23.4版本

2 个答案:

答案 0 :(得分:0)

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

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

def getChangedProjects() {
  Set projects = []
  def changeLogSets = currentBuild.changeSets
  for (int i = 0; i < changeLogSets.size(); i++) {
      def entries = changeLogSets[i].items
      for (int j = 0; j < entries.length; j++) {
          def entry = entries[j]
          def files = new ArrayList(entry.affectedFiles)
          for (int k = 0; k < files.size(); k++) {
            def file = files[k]
            // get the project folder name and
            // add it to changed projects set
            projects.add(file.path.tokenize('/')[1])
          }
      }
  }
  return projects.findAll {it != null}
}

如果可以的话,目前最好的方法是将您的列表分成单独的系列:

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

答案 1 :(得分:0)

这不是理想的选择,但可以完成您的工作

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)