微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决通过将数据框的行和列索引与另一个数据框的列匹配来重新格式化数据框

我的目标是转换数据框“连接”的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}])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。