Разделите столбцы в df на другое значение df в зависимости от условия - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть фрейм данных:

df = pd.DataFrame({'date': ['2013-04-01','2013-04-01','2013-04-01','2013-04-02', '2013-04-02'],
           'month': ['1','1','3','3','5'],
          'pmonth': ['1', '1', '2', '5', '5'],
          'duration': [30, 15, 20, 15, 30],
         'pduration': ['10', '20', '30', '40', '50']})

Я должен разделить duration и pduration на столбец значений второго фрейма данных, где совпадают дата и месяц двух df.Второй df:

 df = pd.DataFrame({'date': ['2013-04-01','2013-04-02','2013-04-03','2013-04-04', '2013-04-05'],
           'month': ['1','1','3','3','5'],
          'value': ['1', '1', '2', '5', '5'],
          })

Второй df сгруппирован по дате и месяцу, поэтому дублирующая комбинация даты и месяца не будет присутствовать во втором df.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

вы можете объединить два фрейма данных, где дата и месяц, соответствующие столбцу значений, будут добавлены в первый фрейм данных.Если совпадения нет, оно будет представлено NaN.Затем вы можете сделать операцию деления.см. код ниже

Если предположить, что ваш второй фрейм данных df2, то

df3 = df2.merge(df, how = 'right')
for col in ['duration','pduration']:
    df3['new_'+col] = df3[col].astype(float)/df3['value'].astype(float)
df3

приведет к

date    month   value   pmonth  duration    pduration   newduration newpduration
0   2013-04-01  1   1   1   30  10  30.0    10.0
1   2013-04-01  1   1   1   15  20  15.0    20.0
2   2013-04-01  3   NaN 2   20  30  NaN NaN
3   2013-04-02  3   NaN 5   15  40  NaN NaN
4   2013-04-02  5   NaN 5   30  50  NaN NaN
0 голосов
/ 23 февраля 2019

Сначала необходимо проверить, совпадают ли dtypes столбца date и month в обоих DataFrames и числовые значения для столбцов для деления:

#convert to numeric
df1['pduration'] = df1['pduration'].astype(int)
df2['value'] = df2['value'].astype(int)

print (df1.dtypes)
date         object
month        object
pmonth       object
duration      int64
pduration     int32

print (df2.dtypes)
date     object
month    object
value     int32
dtype: object

Затем merge с левым соединениеми разделите на DataFrame.div

df = df1.merge(df2, on=['date', 'month'], how='left')

df[['duration_new','pduration_new']] = df[['duration','pduration']].div(df['value'], axis=0)
print (df)
         date month pmonth  duration  pduration  value  duration_new  \
0  2013-04-01     1      1        30         10    1.0          30.0   
1  2013-04-01     1      1        15         20    1.0          15.0   
2  2013-04-01     3      2        20         30    NaN           NaN   
3  2013-04-02     3      5        15         40    NaN           NaN   
4  2013-04-02     5      5        30         50    NaN           NaN   

   pduration_new  
0           10.0  
1           20.0  
2            NaN  
3            NaN  
4            NaN  

Для удаления value используйте столбец pop:

df[['duration_new','pduration_new']] = (df[['duration','pduration']]
                                             .div(df.pop('value'), axis=0))
print (df)
         date month pmonth  duration  pduration  duration_new  pduration_new
0  2013-04-01     1      1        30         10          30.0           10.0
1  2013-04-01     1      1        15         20          15.0           20.0
2  2013-04-01     3      2        20         30           NaN            NaN
3  2013-04-02     3      5        15         40           NaN            NaN
4  2013-04-02     5      5        30         50           NaN            NaN
0 голосов
/ 23 февраля 2019

Вы можете объединить второй df с первым df и затем разделить.

Рассматривайте первый df как df1, а второй df как df2

df1 = df1.merge(df2, on=['date', 'month'], how='left').fillna(1)
df1
         date month pmonth  duration pduration value
0  2013-04-01     1      1        30        10     1
1  2013-04-01     1      1        15        20     1
2  2013-04-01     3      2        20        30     1
3  2013-04-02     3      5        15        40     1
4  2013-04-02     5      5        30        50     1

df1['duration'] = df1['duration'] / df1['value']
df1['pduration'] = df1['pduration'] / df1['value']
df1.drop('value', axis=1, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...