Pandas 从列列表中指定结果
假设我有一个数据帧,如下所示:Pandas 从列列表中指定结果,pandas,dataframe,Pandas,Dataframe,假设我有一个数据帧,如下所示: 将熊猫作为pd导入 将numpy作为np导入 np.随机种子(42) df=pd.DataFrame({'A':np.random.randn(5),'B':np.zeros(5),'C':np.zeros(5)}) df >>> A、B、C 0 0.496714 0.0 0.0 1 -0.138264 0.0 0.0 2 0.647689 0.0 0.0 3 1.523030 0.0 0.0 4 -0.234153 0.0 0.0 当
将熊猫作为pd导入
将numpy作为np导入
np.随机种子(42)
df=pd.DataFrame({'A':np.random.randn(5),'B':np.zeros(5),'C':np.zeros(5)})
df
>>>
A、B、C
0 0.496714 0.0 0.0
1 -0.138264 0.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 0.0
当A
为负值时,我有一个列列表,我想用值1填充它
idx=df.A<0
cols=['B','C']
因此,在本例中,我希望将索引[1,'B']和[4,'C']设置为1。
我尝试的是:
但是,执行df.loc[idx,cols]=1
将整行设置为1,而不仅仅是单个列。我还尝试了df.loc[idx,cols]=pd.get\u dummies(cols)
,结果如下:
A B C
0 0.496714 0.0 0.0
1 -0.138264 0.0 1.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 NaN NaN
我假设这是因为get\u dummies
的索引和数据帧没有对齐
预期产出:
abc
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0
那么什么是最好的(阅读速度最快的)方法呢。在我的例子中,有1000行和5列
结果的时间安排:
TLDR:直接编辑值更快
%%timeit
df.values[idx,df.columns.get_indexer(cols)]=1
每个回路123µs±2.5µs(7次运行的平均值±标准偏差,每个10000个回路)
%%timeit
df.iloc[idx.array,df.columns.get\u indexer(cols)]=1
每个循环266µs±7µs(7次运行的平均值±标准偏差,每个循环1000次)使用numpy索引提高性能:
idx = df.A < 0
res = ['B', 'C']
arr = df.values
arr[idx, df.columns.get_indexer(res)] = 1
print (arr)
[[ 0.49671415 0. 0. ]
[-0.1382643 1. 0. ]
[ 0.64768854 0. 0. ]
[ 1.52302986 0. 0. ]
[-0.23415337 0. 1. ]]
备选方案:
idx = df.A < 0
res = ['B', 'C']
df.values[idx, df.columns.get_indexer(res)] = 1
print (df)
A B C
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0
idx=df.A<0
res=['B','C']
df.values[idx,df.columns.get_indexer(res)]=1
打印(df)
A、B、C
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0
尽可能避免python中的for循环我想这是一个答案,但希望找到更有效的方法+1尽管如此。我觉得应该有一种方法来组合,df.columns.get_indexer
和loc
,来重新创建整个数据帧选项。无论如何,感谢您提供的解决方案,我们将在接受之前等待一段时间。df.iloc[idx.array,df.columns.get\u indexer(cols)]=1
可能会起作用
df = pd.DataFrame(arr, columns=df.columns, index=df.index)
print (df)
A B C
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0
idx = df.A < 0
res = ['B', 'C']
df.values[idx, df.columns.get_indexer(res)] = 1
print (df)
A B C
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0