在pandas df(来自csv文件的数据)中,我尝试通过将每列除以其他每列来添加新列(比率)。
到目前为止,我一直停留在将所有列除以第一个列的过程中(希望稍后进行迭代)。
ratio_df = df.join(df.div(df['Hv10'], axis=0), rsuffix='_new_ratio')
我从处理类似问题的帖子中获取此代码。
pandas dataframe create new columns and fill with calculated values from same df
我收到以下错误消息:
ValueError: operands could not be broadcast together with shapes (235170,) (3618,)
我不确定为什么会收到此错误消息,因为我将每一列除以另一列(因此尺寸应相同)
我究竟做错了什么?
是否有一步生成所有这些新比率列的过程?
希望我的描述清楚。
谢谢!
最佳答案
您走在正确的道路上,但是联接不是正确的操作。您应该可以使用pd.concat
执行此操作。
pd.concat([df.div(df[col], axis=0) for col in df.columns], axis=1) # each column with every other column
如果要避免将列与自身分开,可以使用
df.columns.difference
:pd.concat([df[df.columns.difference([col])].div(df[col], axis=0) \
for col in df.columns], axis=1)
您也可以使用
df.add_suffix('_new_ratio')
将后缀添加到列中。MCVE:
import pandas as pd
import numpy as np
np.random.seed([3, 14])
df = pd.DataFrame(np.random.randn(10, 3), columns=list('ABC'))
df
A B C
0 -0.602923 -0.402655 0.302329
1 -0.524349 0.543843 0.013135
2 -0.326498 1.385076 -0.132454
3 -0.407863 1.302895 -0.604236
4 -0.243362 -0.211261 -2.056621
5 0.517868 -0.040749 -1.051875
6 0.607092 -2.230437 -0.610389
7 0.223345 0.841994 -1.564391
8 0.031653 0.655489 -0.288834
9 -0.467438 0.119117 1.519430
df_new = pd.concat([df[df.columns.difference([col])].div(df[col], axis=0)\
.add_suffix('_n_r') for col in df.columns], axis=1)
df_new
B_n_r C_n_r A_n_r C_n_r A_n_r B_n_r
0 0.667838 -0.501438 1.497369 -0.750838 -1.994263 -1.331845
1 -1.037176 -0.025050 -0.964156 0.024152 -39.919620 41.403685
2 -4.242213 0.405682 -0.235726 -0.095630 2.464987 -10.457000
3 -3.194442 1.481468 -0.313044 -0.463764 0.675006 -2.156269
4 0.868095 8.450867 1.151948 9.734958 0.118331 0.102723
5 -0.078686 -2.031166 -12.708707 25.813488 -0.492328 0.038739
6 -3.673971 -1.005432 -0.272185 0.273663 -0.994598 3.654123
7 3.769924 -7.004363 0.265257 -1.857959 -0.142768 -0.538225
8 20.708576 -9.125012 0.048289 -0.440639 -0.109589 -2.269430
9 -0.254830 -3.250547 -3.924192 12.755771 -0.307641 0.078396
关于python - 将每列除以其他每列,并根据结果创建一个新的数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46103023/