Python 使用带有通用后缀的变量名在Pandas中工作

Python 使用带有通用后缀的变量名在Pandas中工作,python,pandas,Python,Pandas,我的大部分数据工作都是在SAS中完成的,但需要在特定的项目中使用python(我不是很擅长python)。我有这样一个数据帧: values = ['a_us', 'b_us', 'c_us', 'a_ww','b_ww','c_ww'] df = pd.DataFrame(np.random.rand(1, 6), columns=values[:6]) 我需要做的一件事是计算a、b和c公司的美国与WW的比率。我知道如何在python中实现这一点——我只为每家公司实现这一点:

我的大部分数据工作都是在SAS中完成的,但需要在特定的项目中使用python(我不是很擅长python)。我有这样一个数据帧:

    values = ['a_us', 'b_us', 'c_us', 'a_ww','b_ww','c_ww']
    df = pd.DataFrame(np.random.rand(1, 6), columns=values[:6])
我需要做的一件事是计算a、b和c公司的美国与WW的比率。我知道如何在python中实现这一点——我只为每家公司实现这一点:

    df['*company*_ratio'] = df['*company*_us']/df['*company*_ww']
但是,如果不写出每个等式,我怎么能做到这一点呢?我在想我能做点什么

    for x in [a,b,c]:
或者我可以定义一个函数。然而,我不知道如何实现这两个选项,甚至不知道搜索什么来找到答案(我确信以前有人问过)。在SAS中,我只需编写一个宏来填充公司

谢谢。

您可以首先通过以下方式按列的第一个字符查找值:

或者,如果列是按
(更适合于实际数据),则使用第一个子字符串

比较

import pandas as pd
import numpy as np

np.random.seed(0)
values = ['a_us', 'b_us', 'c_us', 'a_ww','b_ww','c_ww']
df = pd.DataFrame(np.random.rand(1, 6), columns=values[:6])

df['a_ratio'] = df['a_us']/df['a_ww']
df['b_ratio'] = df['b_us']/df['b_ww']
df['c_ratio'] = df['c_us']/df['c_ww']
print df
       a_us      b_us      c_us      a_ww      b_ww      c_ww   a_ratio  \
0  0.548814  0.715189  0.602763  0.544883  0.423655  0.645894  1.007213   

    b_ratio   c_ratio  
0  1.688142  0.933223  
同:

import pandas as pd
import numpy as np

np.random.seed(0)
values = ['a_us', 'b_us', 'c_us', 'a_ww','b_ww','c_ww']
df = pd.DataFrame(np.random.rand(1, 6), columns=values[:6])

for x in df.columns.str[0].unique():
    df[x + '_ratio'] = df[x+'_us']/df[x+'_ww']
print df
       a_us      b_us      c_us      a_ww      b_ww      c_ww   a_ratio  \
0  0.548814  0.715189  0.602763  0.544883  0.423655  0.645894  1.007213   

    b_ratio   c_ratio  
0  1.688142  0.933223  
你应该使用多重索引

您应该阅读本节,但您的具体案例可以是:

df = pandas.DataFrame(np.random.rand(10, 6), columns=pandas.MultiIndex.from_product([['us', 'ww'], ['a', 'b', 'c']]))

ratio = df['us']/ df['ww']

结果是一个包含3列a、b、c的数据帧,3个要求的比率

我相信有人会给出一个更好/更聪明的方法,所以我将把循环作为注释:
对于[“a”、“b”、“c”]中的x:df[x+'\u比率]=df[x+'\u-us']/df[x+'\u-ww']
(注意,a、b和c不是变量,所以您需要
)除了我的答案——如果你只有一行,你可能应该重新构造数据,使a,b,c是行,ww,us是列——计算要简单得多。使用
值[:6]有什么特别的原因吗
?只要使用
值,您就会得到完全相同的结果。感谢所有人的回复——它们非常有用。@MattDMo,您是对的:[:6]是不必要的。直到您指出这一点,我才意识到这一点——谢谢。我会对集合中的x使用
(c.split('.')[0]表示df.columns.tolist()中的c)
相反,因为真实的公司名称很可能有不止一个字符是的,你是对的,所以我添加了基于
拆分的第二个解决方案。谢谢你的建议。
import pandas as pd
import numpy as np

np.random.seed(0)
values = ['a_us', 'b_us', 'c_us', 'a_ww','b_ww','c_ww']
df = pd.DataFrame(np.random.rand(1, 6), columns=values[:6])

for x in df.columns.str[0].unique():
    df[x + '_ratio'] = df[x+'_us']/df[x+'_ww']
print df
       a_us      b_us      c_us      a_ww      b_ww      c_ww   a_ratio  \
0  0.548814  0.715189  0.602763  0.544883  0.423655  0.645894  1.007213   

    b_ratio   c_ratio  
0  1.688142  0.933223  
df = pandas.DataFrame(np.random.rand(10, 6), columns=pandas.MultiIndex.from_product([['us', 'ww'], ['a', 'b', 'c']]))

ratio = df['us']/ df['ww']