#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
разместить столбец, а также название фрукта.
-
Вы должны найти количество идентичных имен столбцов с
value_counts()
, то[df.columns.unique()]
есть, чтобы вы могли поддерживать порядок (в противномvalue_counts
случае будет сортировка, и это добавит столбцы в неправильные места). -
Затем добавьте 1, потому что вы вставляете столбец после каждого дублированного названия фрукта (что увеличивает количество столбцов на 1 в группе).
-
Затем возьмите совокупную сумму и вычтите 1, что даст вам позицию, необходимую для добавления столбцов.
-
Наконец, выполните цикл
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