Python 通过将数据帧的行和列索引与另一个数据帧的列相匹配来重新格式化数据帧
我的目标是转换名为“concatenated”的数据帧的File1和File2列的以下内容: 串联Python 通过将数据帧的行和列索引与另一个数据帧的列相匹配来重新格式化数据帧,python,pandas,dataframe,loc,isin,Python,Pandas,Dataframe,Loc,Isin,我的目标是转换名为“concatenated”的数据帧的File1和File2列的以下内容: 串联 File1 File2 Frequency Cambo_1.csv Cambo_2.csv 3 Cambo_1.csv Cambo_3.csv 2 Cambo_2
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\u nr,row\u vals)
的元组,例如:
>> for i in dataframe.iterrows():
>> print(i)
(0, File1 Cambo_1.csv
File2 Cambo_2.csv
Frequency 3
Name: 0, dtype: object)
像这样迭代的更典型的方法是
对于数据帧中的i,r,iterrows():…
或者只使用df.apply(lambda行:{some code}])
非常感谢您,@tania!这解决了我的问题。这是我第一次遇到交叉表!还感谢您解释我的代码哪里出了问题,这将有助于我今后避免同样的错误。