首页 > 解决方案 > 如何根据另一列中的某些值创建新列

问题描述

对于每一天,我使用不同的颜色。我需要创建一个新列来查看每种颜色的用户与第一天的比率。

例如,对于蓝色,最早的日期是2020-01-01,对应的“用户”值是 100。所以,对于2020-01-02,我想要的值应该是102/100 = 1.02

raw_data = [
        {'date': '2020-01-01', 'color': 'blue', 'users': 100},
        {'date': '2020-01-02', 'color': 'blue', 'users': 102},
        {'date': '2020-01-03', 'color': 'blue', 'users': 104},
        {'date': '2020-01-04', 'color': 'blue', 'users': 98},
        {'date': '2020-01-02', 'color': 'red', 'users': 100},
        {'date': '2020-01-03', 'color': 'red', 'users': 107},
        {'date': '2020-01-04', 'color': 'red', 'users': 114},
        {'date': '2020-01-05', 'color': 'red', 'users': 150},
    ]

到目前为止,我知道我可以使用下面的代码获取每种颜色的最小日期,但不知道下一步该怎么做

grouped = df.groupby('color')['date']
min = grouped.min()

标签: python-3.xpandasdataframe

解决方案


sort数据框的值Date然后groupby使用color转换列,然后使用users除以转换后的列以获得比率:firstSeries.divusers

df['date'] = pd.to_datetime(df['date'])
df['ratio'] = df['users'].div(
    df.sort_values('date').groupby('color')['users'].transform('first')
)

        date color  users  ratio
0 2020-01-01  blue    100   1.00
1 2020-01-02  blue    102   1.02
2 2020-01-03  blue    104   1.04
3 2020-01-04  blue     98   0.98
4 2020-01-02   red    100   1.00
5 2020-01-03   red    107   1.07
6 2020-01-04   red    114   1.14
7 2020-01-05   red    150   1.50

推荐阅读