Python熊猫:数据框架中的优雅划分
我是stackoverflow的新手,已经从R切换到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'
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)连接起来。
。还有其他方法。