Python 使用带有通用后缀的变量名在Pandas中工作
我的大部分数据工作都是在SAS中完成的,但需要在特定的项目中使用python(我不是很擅长python)。我有这样一个数据帧: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中实现这一点——我只为每家公司实现这一点:
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']