问题
"如何将行值与列名匹配,并在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
答案 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)
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