Изменение / преобразование фрейма данных в python

#python #pandas #dataframe

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

Вопрос:

У меня есть фрейм данных со значениями date, категории, которые случайным образом назначаются из одной буквы в 3 строки символов, и частоты [‘A’, ‘B’, ‘C’]

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

Как я могу это сделать?

 This is my df (i forgot to include the index):
 -------- ---------- ------- ------- ------- 
| Date   | Category | freqA | freqB | freqC |
 -------- ---------- ------- ------- ------- 
| 2/1/19 | A        | 2     | 89    | 7     |
 -------- ---------- ------- ------- ------- 
| 2/2/19 | B        | 5     | 98    | 8     |
 -------- ---------- ------- ------- ------- 
| 2/3/19 | A        | 10    | 100   | 12    |
 -------- ---------- ------- ------- ------- 
| 2/4/19 | A        | 17    | 121   | 15    |
 -------- ---------- ------- ------- ------- 
| 2/5/29 | C        | 21    | 133   | 25    |
 -------- ---------- ------- ------- ------- 
| 2/6/19 | C        | 25    | 134   | 31    |
 -------- ---------- ------- ------- ------- 

This is my target df:
 ------ ----------- ----------- ----------- ------------- 
| Date | CategoryA | CategoryB | CategoryC | Category[a] |
 ------ ----------- ----------- ----------- ------------- 
| Date | freqA     | freqA     | freqA     | freqA       |
 ------ ----------- ----------- ----------- ------------- 
  

Я очень новичок в python и pandas

Итак, я ценю всю помощь, которую я могу получить

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

1. Пожалуйста, покажите нам что-нибудь, что вы пробовали? Кроме того, целевой df выглядит странно, вы просто хотите freqA , чтобы в столбцах или значениях freqA

2. @Grayrigel Мне нужны значения freqA Я пробовал что-то подобное с набором данных временных рядов covid-19, но он был построен иначе, чем этот, пока я не написал никакого кода для этого фрейма данных

3. Я добавил ответ, дайте мне знать, работает ли он для вас.

4. Большое вам спасибо! Это сработало!

5. Рад, что смог помочь. Повезло. Счастливого кодирования !! 🙂

Ответ №1:

Работает ли это для вас:

 #working with subset of your data
>>> df = pd.DataFrame({'date':['2/1/19','3/1/19','4/1/19', '5/1/19','6/1/19'], 'Category':['A','B','A','A','C'],'freqA':[2,5,10
,17,21],'freqB':[89,98,100,121,133]})

#input data
>>> df
     date Category  freqA  freqB
0  2/1/19        A      2     89
1  3/1/19        B      5     98
2  4/1/19        A     10    100
3  5/1/19        A     17    121
4  6/1/19        C     21    133

#using pivot to reshape the dataframe and renaming the columns
>>> df1 = df.pivot(index ='date', columns='Category',values='freqA')
>>> df1.columns = [f'Category{x}' for x in  df1.columns.tolist()]
>>> print(df1)
  

Вывод:

         CategoryA  CategoryB  CategoryC
date                                   
2/1/19        2.0        NaN        NaN
3/1/19        NaN        5.0        NaN
4/1/19       10.0        NaN        NaN
5/1/19       17.0        NaN        NaN
6/1/19        NaN        NaN       21.0
  

Вы также можете позаботиться о NaN значениях с fillna помощью . Вот пример:

 >>> df1.fillna(method='ffill', inplace=True)
>>> df1.fillna(method='bfill', inplace=True)

        CategoryA  CategoryB  CategoryC
date                                   
2/1/19        2.0        5.0       21.0
3/1/19        2.0        5.0       21.0
4/1/19       10.0        5.0       21.0
5/1/19       17.0        5.0       21.0
6/1/19       17.0        5.0       21.0