Переформатирование фрейма данных путем сопоставления его индекса строки и столбца со столбцом другого фрейма данных

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Моя цель — преобразовать следующее содержимое столбцов File1 и File2 моего фрейма данных с именем ‘concatenated’:

объединенный

 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
  

Кто-нибудь хочет помочь?

Ответ №1:

Одним из способов сделать это было бы перекрестное сопоставление двух столбцов и применение функции 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}]) .

Комментарии:

1. Большое тебе спасибо, @tania! Это решило мою проблему. Это моя первая встреча с перекрестной таблицей! Также спасибо за объяснение, где я ошибся в своем коде, это помогло бы мне избежать той же ошибки в будущем.