Python 将一个数字除以表中列的所有值
df1有一列(总计),两个值分别为5000和1000,每个值的id分别为A和B。df2有一列(标记)有10个值,其中前5个(100200300400500)值有id A,接下来5个值有id B(10,20,30,40,50)。 现在我必须得到预期的输出Python 将一个数字除以表中列的所有值,python,pandas,Python,Pandas,df1有一列(总计),两个值分别为5000和1000,每个值的id分别为A和B。df2有一列(标记)有10个值,其中前5个(100200300400500)值有id A,接下来5个值有id B(10,20,30,40,50)。 现在我必须得到预期的输出 id final_value - A 50 - A 25 - A 16.6 - A 12.5 - A 10 - B 100 - B 50 - B 33.
id final_value
- A 50
- A 25
- A 16.6
- A 12.5
- A 10
- B 100
- B 50
- B 33.3
- B 25
- B 20
A 50
B 100
我的代码是
new_df=df1['total']/df2['marks']
但我得到的结果是
id final_value
- A 50
- A 25
- A 16.6
- A 12.5
- A 10
- B 100
- B 50
- B 33.3
- B 25
- B 20
A 50
B 100
剩余的
NaN
分区使用两个“列”(系列),逐个元素
如果要使用“id”作为链接进行分割,则必须在以下操作之前合并数据帧:
df1 = pd.DataFrame([[5000, 'A'], [1000, 'B']], columns=['test', 'id'])
df2 = pd.DataFrame([[100, 'A'], [200, 'A'], [300, 'A'], [400, 'A'], [500, 'A'], [10, 'B'], [20, 'B'], [30, 'B'], [40, 'B'], [50, 'B']],columns=['marks', 'id'])
df3 = df1.merge(df2, on='id')
df3['test']/df3['marks']
熊猫分部使用两个“列”(系列),一个元素接一个元素 如果要使用“id”作为链接进行分割,则必须在以下操作之前合并数据帧:
df1 = pd.DataFrame([[5000, 'A'], [1000, 'B']], columns=['test', 'id'])
df2 = pd.DataFrame([[100, 'A'], [200, 'A'], [300, 'A'], [400, 'A'], [500, 'A'], [10, 'B'], [20, 'B'], [30, 'B'], [40, 'B'], [50, 'B']],columns=['marks', 'id'])
df3 = df1.merge(df2, on='id')
df3['test']/df3['marks']
设置:
有趣的是,这是有效的:
df2['total'] = df1['total']
df2['final_value'] = df2['total'] / df2['marks']
然后,您只需删除行并将答案复制到新df,如果您需要,如您所述:
new_df = df2[['final_value']]
df2 = df2.drop(['total', 'final_value'], axis = 1)
设置:
有趣的是,这是有效的:
df2['total'] = df1['total']
df2['final_value'] = df2['total'] / df2['marks']
然后,您只需删除行并将答案复制到新df,如果您需要,如您所述:
new_df = df2[['final_value']]
df2 = df2.drop(['total', 'final_value'], axis = 1)
假设您的数据如下所示:
df1 = pd.DataFrame(dict(id=['A', 'B'], total=[5000,1000]))
df2 = pd.DataFrame(dict(id=['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
vals=[100,200,300,400,500,10,20,30,40,50]))
通过首先合并id
列上的两个数据帧,然后应用lambda
函数将total
除以df1中提供的值,可以获得感兴趣的新列。具体而言:
df2['final_result'] = df2.merge(df1, on='id').apply(lambda x: round(x.total/x.vals, 1), axis=1)
如果您只需要id
和final\u result
列,您可以选择这些列:
df2[['id', 'final_result']]
您的数据现在应该与您预期的一样:
id final_result
0 A 50.0
1 A 25.0
2 A 16.7
3 A 12.5
4 A 10.0
5 B 100.0
6 B 50.0
7 B 33.3
8 B 25.0
9 B 20.0
请注意,在lambda函数中,我还应用了一些舍入,以获得您指示的1个小数。假设您的数据如下所示:
df1 = pd.DataFrame(dict(id=['A', 'B'], total=[5000,1000]))
df2 = pd.DataFrame(dict(id=['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
vals=[100,200,300,400,500,10,20,30,40,50]))
通过首先合并id
列上的两个数据帧,然后应用lambda
函数将total
除以df1中提供的值,可以获得感兴趣的新列。具体而言:
df2['final_result'] = df2.merge(df1, on='id').apply(lambda x: round(x.total/x.vals, 1), axis=1)
如果您只需要id
和final\u result
列,您可以选择这些列:
df2[['id', 'final_result']]
您的数据现在应该与您预期的一样:
id final_result
0 A 50.0
1 A 25.0
2 A 16.7
3 A 12.5
4 A 10.0
5 B 100.0
6 B 50.0
7 B 33.3
8 B 25.0
9 B 20.0
请注意,在lambda函数中,我还应用了一些舍入,以仅获得1个小数,如您所示。尝试:
>>df1.set_index(“id”).rename(columns={“total”:“marks”}).div(df2.set_index(“id”).round(1).reset_index()
身份证
0 A 50.0
1A 25.0
2 A 16.7
3 A 12.5
4 A 10.0
5B100.0
6 B 50.0
7 B 33.3
8B25.0
9B20.0
它利用了这样一个事实,即对于两个数据帧之间的任何算术运算,熊猫将通过索引和列自动拟合数据帧属性(因此算术运算将是索引x
上的索引x
和列a
上的列a
)尝试:
>>df1.set_index(“id”).rename(columns={“total”:“marks”}).div(df2.set_index(“id”).round(1).reset_index()
身份证
0 A 50.0
1A 25.0
2 A 16.7
3 A 12.5
4 A 10.0
5B100.0
6 B 50.0
7 B 33.3
8B25.0
9B20.0
它利用了这样一个事实,即对于两个数据帧之间的任何算术运算,熊猫将通过索引和列自动拟合数据帧属性(因此算术运算将是索引
x
上的索引x
和列a
上的列a
)我认为关于这个问题的答案,最有趣的是不同的回答者如何设置他们的数据帧!我认为关于这个问题的答案最有趣的事情是不同的回答者如何设置他们的数据帧!