我一直在寻找最有效的方法来找到大熊猫df每行从左到右( 0,1,2,3 )的所有列中的第一个值,大于另一列( t ),然后将相应的列标签放在新列( val )中。如果没有更大的列值,那么我想改为 0 。
由于某种原因,我找不到任何简单有效的方法(因为实际表很大)。
例如:
初始表格:
t 0 1 2 3
JAN 3 1.9 2.1 2.6 2.9
FEB 6 2.0 4.0 5.0 9.0
MAR 2 1.0 3.0 4.0 4.0
APR 4 1.5 5.0 6.0 2.0
最终表:
t 0 1 2 3 val
JAN 3 1.9 2.1 2.6 2.9 0
FEB 6 2.0 4.0 5.0 9.0 3
MAR 2 1.0 3.0 4.0 4.0 1
APR 4 1.5 3.0 6.0 2.0 2
谢谢!
答案 0 :(得分:2)
实际上,您的初始表和最终表之间的基本矩阵差异很小,这让我花了一些时间注意。行APR和列1中的值从5.0更改为3.0。我将在这里使用后一个矩阵。
from io import StringIO
import numpy as np
import pandas as pd
s = """
t 0 1 2 3
JAN 3 1.9 2.1 2.6 2.9
FEB 6 2.0 4.0 5.0 9.0
MAR 2 1.0 3.0 4.0 4.0
APR 4 1.5 3.0 6.0 2.0
"""
# Read in the string
df = pd.read_csv(StringIO(s), delim_whitespace=True)
# Find all columns greater than your threshold column
s = np.where(df.gt(df['t'],0), ['', 0, 1, 2, 3], np.nan)
# Convert to dataframe, find the first instance, fill the rest with zeros and make a new column
df['vals'] = pd.DataFrame(s).min(axis=1).fillna(0).astype(int).values
# Which yields your expected result
print(df)
# t 0 1 2 3 vals
#JAN 3 1.9 2.1 2.6 2.9 0
#FEB 6 2.0 4.0 5.0 9.0 3
#MAR 2 1.0 3.0 4.0 4.0 1
#APR 4 1.5 3.0 6.0 2.0 2
我以类似问题here的答案为依据,该问题表明该技术比其他几种选择要快。