Для цикла с f-строкой с кадром данных pandas

Мне нужно попробовать создать два цикла (должны быть отдельными):

ЦИКЛ 1) для каждого фрукта:

  1. держите строки, если этот плод верен
  2. удалить строки с повторяющимися датами (можно удалить любую строку)
  3. сохраните результат вышеизложенного в виде кадра данных для каждого фрукта

LOOP 2) для каждого созданного кадра данных, дата графика на fruit_score:

    concat   apple_score  banana_score       date        apple      banana  
1   apple     0.400         0.400        2010-02-12      True        False  
2   banana    0.530         0.300        2010-01-12      False       True   
3   kiwi      0.532          0.200       2010-03-03      False       False  
4   bana      0.634         0.100        2010-03-03      False       True   

Я старался:

fruits = ['apple',  'banana',   'orange']
for fruit in fruits:
    selected_rows = df[df[ fruit ] == True ]
    df_f'{fruit}' = selected_rows.drop_duplicates(subset='date')

for fruit in fruits:
    df_f'{fruit}'.plot(x="date", y=(f'{fruit}_score'), kind="line")

person arv    schedule 24.07.2020    source источник
comment
Вы пытаетесь программно определить имя переменной? вы ожидаете, например, получить переменную с именем df_apple?   -  person Youyoun    schedule 24.07.2020
comment
Вы можете использовать dict вместо получения имени переменной на основе цикла for: stackoverflow.com/a/11553769/1735729   -  person Stergios    schedule 24.07.2020
comment
Не переменные, но я надеялся сгенерировать 2 фрейма данных, помеченных как df_apple и df_banana (в этом примере)   -  person arv    schedule 24.07.2020
comment
попробуйте isin и бросьте дубликаты df[df['concat'].isin(fruits)].drop_duplicates(subset=['date'],keep='first)   -  person Umar.H    schedule 24.07.2020
comment
Затем используйте dict, fruits_df = {} и в цикле for используйте fruits_df[fruit] = ...   -  person Youyoun    schedule 24.07.2020
comment
также не используйте циклы for в пандах, это должно быть последним средством, когда вы не можете использовать какие-либо другие методы.   -  person Umar.H    schedule 24.07.2020
comment
@Manakin, я не думаю, что это сработает, потому что он получил бана в concat, но для столбца банан установлено значение true. + он хочет сбросить дубликаты по дате между одними и теми же фруктами, другой будет сбрасывать дубликаты для всех фруктов с одинаковой датой. Он не зацикливается на кадре данных, а на фруктах.   -  person Youyoun    schedule 24.07.2020
comment
@Youyoun, вы можете подмножить более чем один столбец, просто добавьте fruits к .drop_duplicates здесь ничего сложного, также не нужно перебирать список.   -  person Umar.H    schedule 24.07.2020
comment
@Manakin Как бы вы создали df_apple и df_banana, не зацикливаясь на списке fruits?   -  person Jack Fleeting    schedule 24.07.2020


Ответы (1)


Вы должны сделать что-то в соответствии с рекомендациями @youyoun:

dfs = {}
fruits = ['apple',  'banana']
for fruit in fruits:
    selected_rows = df[df[ fruit ] == True ].drop_duplicates(subset='date')
    dfs[f'df_{fruit}'] = selected_rows

for a,v in dfs.items():
    print(a)
    print(v)

Выход:

df_apple
  concat  apple_score  banana_score        date  apple  banana
1  apple          0.4           0.4  2010-02-12   True   False
df_banana
   concat  apple_score  banana_score        date  apple  banana
2  banana        0.530           0.3  2010-01-12  False    True
4    bana        0.634           0.1  2010-03-03  False    True
person Jack Fleeting    schedule 25.07.2020
comment
еще проще вы могли бы сделать dfs = {fruit, data for fruit,data in df.groupby('fruit').unique()} или что-то в этом роде. - person Umar.H; 25.07.2020