在数据框的列中找到比另一个大的第一个值

时间:2018-06-22 00:24:18

标签: python pandas

我一直在寻找最有效的方法来找到大熊猫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

谢谢!

1 个答案:

答案 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的答案为依据,该问题表明该技术比其他几种选择要快。