Python熊猫:数据框架中的优雅划分

Python熊猫:数据框架中的优雅划分,python,Python,我是stackoverflow的新手,已经从R切换到python。我正在尝试做一些可能不太难的事情,虽然我可以通过屠宰来做到这一点,但我想知道做这件事的最疯狂的方式是什么。我试图使用列D作为查找,将列中的某些值(E其中F=a)除以列中较低的值(E其中F=b): 将熊猫作为pd导入 数据帧({'D':[1,2,3,4,5,1,2,3,4,5,1],'E':[10,20,30,40,50100,250,250,360,567,400],'F':['a','a','a','b','b','b','c'

我是stackoverflow的新手,已经从R切换到python。我正在尝试做一些可能不太难的事情,虽然我可以通过屠宰来做到这一点,但我想知道做这件事的最疯狂的方式是什么。我试图使用列
D
作为查找,将列中的某些值(
E
其中
F=a
)除以列中较低的值(
E
其中
F=b
):

将熊猫作为pd导入
数据帧({'D':[1,2,3,4,5,1,2,3,4,5,1],'E':[10,20,30,40,50100,250,250,360,567,400],'F':['a','a','a','b','b','b','c']))
打印(df)
out=pd.DataFrame({'D':[1,2,3,4,5],'a/b':[0.1,0.08,0.12,0.1111,0.0881])
打印(输出)

有人能帮我把这写得很好吗?

我不太清楚“使用D列作为查找”是什么意思,因为在您提供的示例中不需要这样的查找。 然而,实现您提供的输出的快速而肮脏的方法是

output = pd.DataFrame({'a/b': df[df['F'] == 'a']['E'].values / df[df['F'] == 'b']['E'].values})
output['D'] = df['D']
这使得
输出
成为

        a/b  D
0  0.100000  1
1  0.080000  2
2  0.120000  3
3  0.111111  4
4  0.088183  5

使用pandas数据框中的
.loc
作为
df.loc[行,列]
查找,其中行和列的条件为True

import numpy as np

# get indices from column D. I convert it to a list structure to make sure that the order is maintained.
idx = list(set(df['D']))
# A is an array of values with 'F'=a
A = np.array([df.loc[(df['F']=='a') & (df['D']==i),'E'].values[0] for i in idx])
# B is an array of values with 'F'=b
B = np.array([df.loc[(df['F']=='b') & (df['D']==i),'E'].values[0] for i in idx])

# Now devide towards your new dataframe of divisions
out = pd.DataFrame(np.vstack([A/B,idx]).T, columns = ['a/b','D'])
不使用numpy.vstack,您可以使用:

out = pd.DataFrame(A/B,idx).T
out.columns = ['a/b','D']
同样的结果。我试着在一行中完成它(没有任何理由)

明白了:

df=df.set_索引('D'))
out=df.loc[(df['F']=='a'),'E']/df.loc[(df['F']=='b'),'E']
out=out.reset_index()

谢谢你的想法-我得到了启发。

谢谢。D列需要匹配E中的值,我看我应该把它们混合得更清楚一些:这个df2应该给出与df相同的结果。
df2=pd.DataFrame({'D':[1,2,3,4,5,5,1,3,4,2,1],'E':[10,20,30,40,50,567,100,250,360,250,400],'F':['a'、'a'、'a'、'b'、'b'、'b'、'b'、'c']})
Great,这看起来很好,对于
df2=pd.DataFrame({'D':[1,2,3,4,5,5,1,1,3,4,2,1]、'E':[10,20,30,40,50567,100,250,360,250,400]、'F':[a'、'a'、'a'、'b'、'b'、'b'、'c'])
。是否有一种方法可以完全在pandas内部实现?是的,您可以制作a和B pandas数据帧而不是数组,然后将它们与
pandas.concat(df_a,df_B,axis=1)连接起来。
。还有其他方法。