我有一个Dataframedf
,其中的列是['col_A','col_B','col_C']
并且有1000行。
我也有一个序列,该序列具有DataFrame的列名和一个介于0到1000之间的值作为索引。例如:s就是这样的Serie:
Col_A 20
Col_B 0
Col_C 300
我想将数据框更改为:
df.iloc[0:20,0] = a certain value (column A)
我已经尝试过使用for循环进行切片,但是它花费了太多时间。有熊猫功能可以做到这一点吗?
我的代码是:
for i in range(0,3):
df.iloc[0:s.iloc[i]-1,i] = -1
在一般情况下,有时我需要将Series索引映射到Dataframe列,但是很难找到一种快速且消耗较少的方法。
谢谢
问题来源:stackoverflow
对于循环
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,10, (1000,3)),
columns=['col_A', 'col_B', 'col_C'])
s = pd.Series([20,0,300],
index=['col_A', 'col_B', 'col_C'])
for col, idx in s.iteritems():
df.loc[:idx, col] = -1
df
col_A col_B col_C
0 -999 -999 -999
1 -999 3 -999
2 -999 3 -999
3 -999 2 -999
4 -999 1 -999
.. ... ... ...
995 2 6 9
996 1 9 5
997 2 6 4
998 4 0 1
999 9 2 8
熊猫适用
def f(c, s):
c[:s[c.name]] = -1
return c
df = df.apply(lambda c: f(c,s))
df
col_A col_B col_C
0 -1 6 -1
1 -1 1 -1
2 -1 6 -1
3 -1 1 -1
4 -1 6 -1
.. ... ... ...
995 2 4 3
996 2 0 0
997 8 5 7
998 3 5 5
999 5 7 7
性能在我的本地计算机上,使用N = 1000,for循环略快。将N增加到1M,apply
方法更快:
def for_loop(N):
df = pd.DataFrame(np.random.randint(0,10, (N,3)),
columns=['col_A', 'col_B', 'col_C'])
for col, idx in s.iteritems():
df.loc[:idx, col] = -1
return df
def apply_method(N):
def f(c, s):
c[:s[c.name]] = -1
return c
return df.apply(lambda c: f(c,s))
%timeit for_loop(1000)
1.19 ms ± 58.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit apply_method(1000)
185 ms ± 44.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit for_loop(1000_000)
303 ms ± 25.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit apply_method(1000_000)
162 ms ± 8.84 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。