Как добавить столбец в фрейм данных из списка с сохранением порядка списка

#python #pandas #list #dataframe #csv

#python #pandas #Список #фрейм данных #csv

Вопрос:

У меня есть список A= [‘APPLE’, ‘Orange’,’Mango’]

У меня есть фрейм данных, который выглядит следующим образом

 APPLE APPLE Orange Orange Mango Mango

x.     y.      x.     y.    x.    y.  

1      2       3      3      4     2
:      :       :      :      :     :
  

Я хочу изменить его, добавив еще один столбец с именем fruit после каждой второй строки, чтобы фрейм данных выглядел следующим образом:

 APPLE APPLE Fruit  Orange Orange Fruit Mango Mango. Fruit

x.     y.    APPLE   x.     y.   Orange x.    y.  Mango

1      2    APPLE    3      3   Orange    4     2   Mango
:      :    APPLE    :      :      :     :          Mango
  

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

1. @MartinGustafsson ну, у меня есть фрейм данных с одинаковым именем столбца для разных столбцов

2. @MartinGustafsson это неверно, но это зависит от того, как создается столбец. Например, вы могли бы сделать это без ошибок : df.columns = ['APPLE', 'APPLE', 'Orange', 'Orange', 'Mango', 'Mango'] . Вы столкнетесь с проблемами при переименовании столбцов с использованием метода словаря, поэтому, опять же, это зависит от того, как это делается.

3. @DavidErickson спасибо за подтверждение. Вы знаете, как это сделать?

4. @DavidErickson Спасибо за объяснение, только что узнал это.

5. @DavidErickson большое вам спасибо за решение. Я использовал stack / unstack, а затем использовал столбцы для получения нового фрейма данных.

Ответ №1:

Это далеко не лучшее решение, но оно работает.

 import pandas as pd

def add_fruit(df, fruits):
  new_df = pd.DataFrame()
  for fruit in fruits:
    df_copy = df[fruit].copy()
    df_copy["Fruit"] = [fruit] * len(df.index)
    if new_df.empty:
      new_df = df_copy
    else:
      new_df = pd.concat([new_df, df_copy], axis=1, join='inner')
  return new_df

fruits = ['APPLE', 'Orange','Mango']

df = pd.DataFrame([['x', 'y', 'x', 'y', 'x', 'y'], [1, 2, 3, 3, 4, 2], [7,8,9,10,11,12]], columns = ['APPLE','APPLE','Orange','Orange','Mango','Mango'])

print(add_fruit(df, fruits))
  

Ответ №2:

Вы можете добиться этого динамически, независимо от количества фруктов или количества столбцов на фрукт. Просто создайте ряд, который вернет индекс столбца, в котором мы должны .insert разместить столбец, а также название фрукта.

  1. Вы должны найти количество идентичных имен столбцов с value_counts() , то [df.columns.unique()] есть, чтобы вы могли поддерживать порядок (в противном value_counts случае будет сортировка, и это добавит столбцы в неправильные места).

  2. Затем добавьте 1, потому что вы вставляете столбец после каждого дублированного названия фрукта (что увеличивает количество столбцов на 1 в группе).

  3. Затем возьмите совокупную сумму и вычтите 1, что даст вам позицию, необходимую для добавления столбцов.

  4. Наконец, выполните цикл srs (позиция, в которую вы добавляете столбцы insert ), а также цикл fruit одновременно с zip :

Это то, что srs выглядит так, и это то, что вы просматриваете для динамического добавления столбцов:

 APPLE     2
Orange    5
Mango     8
  

 # df.columns = ['APPLE', 'APPLE', 'Orange', 'Orange', 'Mango', 'Mango']
srs = (df.columns.value_counts()[df.columns.unique()]   1).cumsum() - 1
fruit = srs.index
for f, i in zip(fruit, srs):
    df.insert(i,f'Fruit{i}',f)
df.columns = df.columns.str.replace('d ','')
df
Out[1]: 
  APPLE APPLE  Fruit Orange Orange   Fruit Mango Mango  Fruit
0    x.    y.  APPLE     x.     y.  Orange    x.    y.  Mango
1     1     2  APPLE      3      3  Orange     4     2  Mango
2     :     :  APPLE      :      :  Orange     :     :  Mango