Python 将dataframes值的每一行与第一行进行比较,以查看起始点的更改

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如下所示:

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