问题描述
我的目标是转换数据框“连接”的File1和File2列的以下内容:
串联的
File1 File2 Frequency
Cambo_1.csv Cambo_2.csv 3
Cambo_1.csv Cambo_3.csv 2
Cambo_2.csv Cambo_4.csv 1
Cambo_2.csv Cambo_5.csv 5
转换为以下格式:
数据框
Cambo_1 Cambo_2 Cambo_3 Cambo_4 Cambo_5
Cambo_1 NA 3 2 NA NA
Cambo_2 NA NA NA 1 5
Cambo_3 NA NA NA NA NA
格式看起来像一个关联表。唯一的区别是File1应该出现在新数据框的行部分,而File2应该出现在新数据框的列部分。如果互换,则将显示“ NA”值。另外,请注意,在新格式化的数据框中已经忽略了“ .csv”。
我是编程和Python的新手,无论如何我的代码如下:
for i in dataframe.iterrows():
if re.match(dataframe.loc[i,].astype(str))==re.match(concatenated_ans2['0'].astype(str)) and re.match(dataframe.loc[:,i].astype(str))==re.match(concatenated_ans2['1'].astype(str)):
dataframe.at[rows,columns] = concatenated_ans2['2']
else dataframe.at[rows,columns] = 'NA'
但是我得到了这个错误:
ValueError: Location based indexing can only have [integer,integer slice (START point is INCLUDED,END point is EXCLUDED),listlike of integers,boolean array] types
有人愿意帮助吗?
解决方法
一种方法是将两列交叉制表并应用sum函数:
cross = pd.crosstab(df.File1.str.replace(".csv",''),df.File2.str.replace(".csv",values=df.Frequency,aggfunc='sum')
给出的结果如下:
File2 Cambo_2 Cambo_3 Cambo_4 Cambo_5
File1
Cambo_1 3.0 2.0 NaN NaN
Cambo_2 NaN NaN 1.0 5.0
请注意,索引不包含Cambo_3,因为该值未出现在您提供的示例数据框的File1
列中。此外,如果要删除列名/索引名,只需添加:
cross.index.name = None
cross.columns.name = None
最后,您可能会收到该错误,因为df.iterrows()
会生成(row_nr,row_vals)
的元组,例如:
>> for i in dataframe.iterrows():
>> print(i)
(0,File1 Cambo_1.csv
File2 Cambo_2.csv
Frequency 3
Name: 0,dtype: object)
最典型的迭代方法是for i,r in dataframe,iterrows():...
或仅使用df.apply(lambda row: {some code}])
。