Python 将dataframes值的每一行与第一行进行比较,以查看起始点的更改
我有一个按类别列和日期行列出的价格变化数据框架,我很想比较第一行之后的每一行,回到第一行,看看它是如何随时间变化的百分比 例如,我当前的df如下所示:Python 将dataframes值的每一行与第一行进行比较,以查看起始点的更改,python,pandas,Python,Pandas,我有一个按类别列和日期行列出的价格变化数据框架,我很想比较第一行之后的每一行,回到第一行,看看它是如何随时间变化的百分比 例如,我当前的df如下所示: df = pd.DataFrame({'date': ['2020-03-22', '2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26'], 'price': [2, 3, 6, 7, 12]}) | date | price |-------------|------
df = pd.DataFrame({'date': ['2020-03-22', '2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26'], 'price': [2, 3, 6, 7, 12]})
| date | price
|-------------|--------
0| 2020-03-22 | 2
1| 2020-03-23 | 3
2| 2020-03-24 | 6
3| 2020-03-25 | 5
4| 2020-03-26 | 12
我希望将此价格列更改为第0行的比较,如下所示:
| date | price
|-------------|--------
0| 2020-03-22 | 1
1| 2020-03-23 | 1.5
2| 2020-03-24 | 3
3| 2020-03-25 | 2.5
4| 2020-03-26 | 6
请注意,我的实际数据帧约为25列宽和350行,因此樱桃色拾取列和行将不起作用。我想也许一个循环可以工作,但我担心这将是相当沉重的资源。请注意,数据帧本身是由pivot函数生成的,不确定这是否有帮助
任何帮助都将不胜感激 用于除以列的第一个值:
df['price'] = df['price'].div(df['price'].iloc[0])
print (df)
date price
0 2020-03-22 1.0
1 2020-03-23 1.5
2 2020-03-24 3.0
3 2020-03-25 3.5
4 2020-03-26 6.0
如果需要在没有第一列的情况下处理多列,请使用select:
df.iloc[:, 1:] = df.iloc[:, 1:].div(df.iloc[0, 1:])
print (df)
date price
0 2020-03-22 1.0
1 2020-03-23 1.5
2 2020-03-24 3.0
3 2020-03-25 3.5
4 2020-03-26 6.0
或创建日期时间索引:
如果使用数字列联机工作:
cols = df.select_dtypes(np.number).columns
df[cols] = df[cols].div(df.iloc[0, df.columns.get_indexer(cols)])
@piRSquared的另一个解决方案,谢谢:
df = df.assign(**df.select_dtypes(np.number).pipe(lambda d: d / d.iloc[0]))
print (df)
date price
0 2020-03-22 1.0
1 2020-03-23 1.5
2 2020-03-24 3.0
3 2020-03-25 3.5
4 2020-03-26 6.0
非常好,谢谢你的帮助-第三个选项似乎已经成功了!任意选择数字类型df.assign**df.select\u dtypesnp.number.pipelambda d:d/d.iloc[0]@piRSquared-谢谢,似乎不是数字列,所以在这里工作得很好。
df = df.assign(**df.select_dtypes(np.number).pipe(lambda d: d / d.iloc[0]))
print (df)
date price
0 2020-03-22 1.0
1 2020-03-23 1.5
2 2020-03-24 3.0
3 2020-03-25 3.5
4 2020-03-26 6.0