Pandas:使用方法链修改单元格值
Pandas: modify cell values using method chaining
>>> df
a b c ...
0 1 2
1 3 4
. ...
我希望 b
列加倍。
我知道这个方法
>>> df['b'] *= 2
我可以用方法链方式来做吗?我想更可恶!
像这样。
>>> (df.drop('c', 1)
.someMethodToReplaceBColumnValues())
我有很多清理数据的方法,这是其中一种操作,我一直卡在这个地方。
我遇到过,replace
、set_value
等。但我无法弄清楚如何。
我也尝试了 apply
方法,但它 returns 仅适用于应用该操作的列。所以我只得到 b
带有 apply 方法的列。如何进一步接近?
你可以试试assign
:
df = pd.DataFrame({'a':[1,2,3],
'b':[4,5,6],
'c':[7,8,9]})
print (df)
a b c
0 1 4 7
1 2 5 8
2 3 6 9
print (df.drop('c', 1).assign(b=df.b*2))
a b
0 1 8
1 2 10
2 3 12
print (df.drop('c', 1).apply(lambda x: x * 2 if x.name == 'b' else x))
a b
0 1 8
1 2 10
2 3 12
您可以使用带有自定义函数的应用程序:
def mult(x, columns):
if x.name in columns:
return x*2
else:
return x
print df.apply(mult, args=(['b', 'c'],))
a b c
0 0 0 0
1 1 2 2
2 2 4 4
请注意您将元组作为额外参数传递给 apply 中的函数!
>>> df
a b c ...
0 1 2
1 3 4
. ...
我希望 b
列加倍。
我知道这个方法
>>> df['b'] *= 2
我可以用方法链方式来做吗?我想更可恶! 像这样。
>>> (df.drop('c', 1)
.someMethodToReplaceBColumnValues())
我有很多清理数据的方法,这是其中一种操作,我一直卡在这个地方。
我遇到过,replace
、set_value
等。但我无法弄清楚如何。
我也尝试了 apply
方法,但它 returns 仅适用于应用该操作的列。所以我只得到 b
带有 apply 方法的列。如何进一步接近?
你可以试试assign
:
df = pd.DataFrame({'a':[1,2,3],
'b':[4,5,6],
'c':[7,8,9]})
print (df)
a b c
0 1 4 7
1 2 5 8
2 3 6 9
print (df.drop('c', 1).assign(b=df.b*2))
a b
0 1 8
1 2 10
2 3 12
print (df.drop('c', 1).apply(lambda x: x * 2 if x.name == 'b' else x))
a b
0 1 8
1 2 10
2 3 12
您可以使用带有自定义函数的应用程序:
def mult(x, columns):
if x.name in columns:
return x*2
else:
return x
print df.apply(mult, args=(['b', 'c'],))
a b c
0 0 0 0
1 1 2 2
2 2 4 4
请注意您将元组作为额外参数传递给 apply 中的函数!