Python:pandas:将行值与列名/键的值

时间:2016-10-21 16:20:42

标签: python pandas

问题
"如何将行值与列名匹配,并在pandas中获取该交叉值"

上下文
我们有这样的熊猫df:

df = pd.DataFrame([{'name': 'john', 'john': 1, 'mac': 10}, {'name': 'mac', 'john': 2, 'mac': 20}], columns=["name", "john", "mac"])

看起来像这样:

name | john | mac
john |  1   | 10
mac  |  2   | 20


期望的输出

name | john | mac  | value
john |  1   | 10   | 1
mac  |  2   | 20   | 20

在单词中,列"value"应该从名称相交的相应列中获取数字。

因此,如果name == 'john',则从“' john'”栏中获取值 因此,如果name == 'mac',则从“' mac'

列中获取值

目前已尝试
一群lambdas(没有成功)。

规格
Python:3.5.2
熊猫:0.18.1

2 个答案:

答案 0 :(得分:3)

您可以使用DataFrame.lookup,它接受​​要使用的行和列标签:

In [66]: df
Out[66]: 
   name  john  mac
0  john     1   10
1   mac     2   20

In [67]: df["value"] = df.lookup(df.index, df.name)

In [68]: df
Out[68]: 
   name  john  mac  value
0  john     1   10      1
1   mac     2   20     20

请注意,这会出现重复行标签的问题(通过添加reset_index可以轻松解决)。它应该比调用apply更快,这可能会很慢,但如果你的帧不是太大,那么两者都应该运行得很好。

答案 1 :(得分:2)

好吧,imo lambda是要走的路,但你可以做得很短,如下:

df = pd.DataFrame([{'name': 'john', 'john': 5, 'mac': 10}, {'name': 'mac', 'john': 10, 'mac': 15}], columns=["name", "john", "mac"])
df = df.set_index('name')
df
Out[64]: 
      john  mac
name           
john     5   10
mac     10   15

df['values'] = df.apply(lambda x: x[x.name], axis=1)
In[68]: df
Out[68]: 
      john  mac  values
name                   
john     5   10       5
mac     10   15      15

我确实将索引设置为名称以便于提供,但您可以在没有它的情况下执行此操作:

df = pd.DataFrame([{'name': 'john', 'john': 5, 'mac': 10}, {'name': 'mac', 'john': 10, 'mac': 15}], columns=["name", "john", "mac"])
df['values'] = df.apply(lambda x: x[x['name']], axis=1)
df
Out[71]: 
   name  john  mac  values
0  john     5   10       5
1   mac    10   15      15