我有看起来像这样的数据框系列-
a b r
1 43 630 587
d b c
1 34 30 87
我想创建一个看起来像新的数据框-
a b r d c
43 630 587 0 0
0 30 0 34 87
我已经使用了代码-
appended_data= pd.concat(appended_data, axis=0)
其中列表append_data包含各个数据框系列作为元素。
早些时候,当我将其与其他数据集结合使用时,它并没有引发任何错误,但在新数据集中却显示了ValueError: Plan shapes are not aligned
Note-Earlier数据集也有重复的列,然后工作正常,我还更新了熊猫。这些是我在网上找到的解决方案。
完整代码-
dir_list = [benign_freq_dir,malign_freq_dir]
appended_data = []
for l in dir_list:
for root, dirs, files in os.walk(l):
#print(root)
for name in files:
file = open(root+"/"+name,'r')
print(name)
print("\n")
df = pd.read_csv(file,header=None,error_bad_lines=False) #In windows and python3 always pass file object not the path directly in pd.read_csv
#print(df)
df = df.rename(columns={0: 'col'})
#print(df)
df = pd.DataFrame(df.col.str.split(' ',1).tolist(), columns = ['col1','col2']).T.reset_index(drop=True)
df = df.rename(columns=df.iloc[0]).drop(df.index[0])
print(df)
appended_data.append(df)
if l==benign_freq_dir:
df['class']=0
else:
df['class']=1
#for l in appended_data:
# print(l)
# print(type(l))
appended_data= pd.concat(appended_data, axis=0,sort=False)
编辑-
输出-
for dfx in appended_data:
print(dfx.head(2).to_dict())
答案 0 :(得分:2)
您将需要一个外部联接。
import pandas as pd
df1 = pd.DataFrame({
'a': [43],
'b': [630],
'r': [587]
})
df2 = pd.DataFrame({
'd': [34],
'b': [30],
'c': [87]
})
df3 = df1.merge(df2, how='outer').fillna(0)
print(df3)
满足您的需求。
a b r d c
0 43.0 630 587.0 0.0 0.0
1 0.0 30 0.0 34.0 87.0
pd.merge上的文档
outer join
编辑:
OP,pd.concat
应该可以按预期工作,而Anton证明了这一点。
因为pd.merge
是我的答案,所以我必须坚持。
如果要合并数据帧列表,请使用一些伪代码。
def merge(lst, df=None):
if df is None:
df = lst.pop()
to_be_merged = lst.pop()
merged = df.merge(to_be_merged, how='outer')
if lst:
return merge(lst, merged)
return merged.fillna(0)
df = merge(list_of_dfs)
这样,您就可以立即知道哪个df有问题,因为显然您的数据存在问题。捕获异常并使用.describe()
和.info()
调试此问题。
答案 1 :(得分:1)
您可以使用pd.concat
。但是,您应该同时传递两个数据帧。
pd.concat([df1,df2], axis=0, sort=False).fillna(0) #.astype(int) for ints
# a b r d c
#0 43.0 630 587.0 0.0 0.0
#0 0.0 30 0.0 34.0 87.0
Tom Wojcik的样本数据。