如何在 pandas 数据帧中应用乘法
how to apply multiplication within pandas dataframe
请告知如何获得以下输出:
df1 = pd.DataFrame([['1, 2', '2, 2','3, 2','1, 1', '2, 1','3, 1']])
df2 = pd.DataFrame([[1, 2, 100, 'x'], [3, 4, 200, 'y'], [5, 6, 300, 'x']])
import numpy as np
df22 = df2.rename(index = lambda x: x + 1).set_axis(np.arange(1, len(df2.columns) + 1), inplace=False, axis=1)
f = lambda x: df22.loc[tuple(map(int, x.split(',')))]
df = df1.applymap(f)
print (df)
Output:
0 1 2 3 4 5
0 2 4 6 1 3 5
df1 是 df2 的 'address' 行,col 格式(1,2 是第一行,第二列是 2,2,2 是 4 3,2 是 6 等等)
我需要添加第 3 列和第 4 列的值以获得类似 (2*100x, 4*200y, 6*300x, 1*100x, 3*200y, 5*300x)
的内容
输出应该是 5000(x 和 y 的总和), 0.28 ( 1400/5000 - y 的百分比)
我不清楚你为什么需要 df1 和 df...也许你的问题缺少一些细节?
您可以直接计算您的值:
df22['val'] = (df22[1] + df22[2])*df22[3]
输出:
1 2 3 4 val
1 1 2 100 x 300
2 3 4 200 y 1400
3 5 6 300 x 3300
从那里可以直接计算总和(总计和按第 4 列分组):
total = df22['val'].sum() # 5000
y_sum = df22.groupby(4).sum().loc['y', 'val'] # 1400
print(y_sum/total) # 0.28
编辑:如果 df1 不一定包含第 1 列和第 2 列的所有成员,您可以遍历它(在您的问题中不清楚为什么 df1 是数据框或者它是否可以有多行,因此我把它弄平了):
df22['val'] = 0
for c in df1.to_numpy().flatten():
i, j = map(int, c.split(','))
df22.loc[i, 'val'] += df22.loc[i, j]*df22.loc[i, 3]
这会为您提供与上述示例相同的输出,但会忽略不在 df1 中的值。
请告知如何获得以下输出:
df1 = pd.DataFrame([['1, 2', '2, 2','3, 2','1, 1', '2, 1','3, 1']])
df2 = pd.DataFrame([[1, 2, 100, 'x'], [3, 4, 200, 'y'], [5, 6, 300, 'x']])
import numpy as np
df22 = df2.rename(index = lambda x: x + 1).set_axis(np.arange(1, len(df2.columns) + 1), inplace=False, axis=1)
f = lambda x: df22.loc[tuple(map(int, x.split(',')))]
df = df1.applymap(f)
print (df)
Output:
0 1 2 3 4 5
0 2 4 6 1 3 5
df1 是 df2 的 'address' 行,col 格式(1,2 是第一行,第二列是 2,2,2 是 4 3,2 是 6 等等)
我需要添加第 3 列和第 4 列的值以获得类似 (2*100x, 4*200y, 6*300x, 1*100x, 3*200y, 5*300x)
输出应该是 5000(x 和 y 的总和), 0.28 ( 1400/5000 - y 的百分比)
我不清楚你为什么需要 df1 和 df...也许你的问题缺少一些细节?
您可以直接计算您的值:
df22['val'] = (df22[1] + df22[2])*df22[3]
输出:
1 2 3 4 val
1 1 2 100 x 300
2 3 4 200 y 1400
3 5 6 300 x 3300
从那里可以直接计算总和(总计和按第 4 列分组):
total = df22['val'].sum() # 5000
y_sum = df22.groupby(4).sum().loc['y', 'val'] # 1400
print(y_sum/total) # 0.28
编辑:如果 df1 不一定包含第 1 列和第 2 列的所有成员,您可以遍历它(在您的问题中不清楚为什么 df1 是数据框或者它是否可以有多行,因此我把它弄平了):
df22['val'] = 0
for c in df1.to_numpy().flatten():
i, j = map(int, c.split(','))
df22.loc[i, 'val'] += df22.loc[i, j]*df22.loc[i, 3]
这会为您提供与上述示例相同的输出,但会忽略不在 df1 中的值。