我的数据框如下所示
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版本
答案 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)