Python 通过将数据帧的行和列索引与另一个数据帧的列相匹配来重新格式化数据帧

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

我的目标是转换名为“concatenated”的数据帧的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\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!这解决了我的问题。这是我第一次遇到交叉表!还感谢您解释我的代码哪里出了问题,这将有助于我今后避免同样的错误。