Python 根据另一列中的值减法选择一列中的值
我有一个包含4列的数据框。我想将Python 根据另一列中的值减法选择一列中的值,python,pandas,Python,Pandas,我有一个包含4列的数据框。我想将col2的最后一个条目从第二个条目减去最后一个条目,看看从第二个条目减去最后一个条目是否大于10。如果是这样,我希望在第一列中获取last和second to last的对应值,并将第一列中second to last的值替换为NaN,然后创建另一个数据帧作为输出。有什么办法可以让我在熊猫身上做吗 col1 col2 col3 col4 e 21 1 2 m 20 1 2 k 9
col2
的最后一个条目从第二个条目减去最后一个条目,看看从第二个条目减去最后一个条目是否大于10。如果是这样,我希望在第一列中获取last和second to last的对应值,并将第一列中second to last的值替换为NaN
,然后创建另一个数据帧作为输出。有什么办法可以让我在熊猫身上做吗
col1 col2 col3 col4
e 21 1 2
m 20 1 2
k 9 1 2
j 20 1 2
输出:
col1 col3 col4
[j, 'NaN'] 1 2
我正在寻找基于查询的方法,以便通过应用groupby
或过滤
使数据帧格式的输出变得更容易
到目前为止我尝试过的代码
看来它不起作用了
last = df.iloc[-1]['col2']
second_to_last = df.iloc[-2]['col2']
difference = df.query("{ref} - {ref_1} > 10".format(ref=last, ref_1= second_to_last))
我在第3行中遇到的错误:
ValueError: multi-line expressions are only valid in the context of data
您可以使用:
#get last and previous index values
last = df.index[-1]
second_to_last = df.index[-2]
#boolena mask - scalar
m1 = df.loc[last, 'col2'] - df.loc[second_to_last, 'col2'] > 10
#boolean mask - array
m2 = (df.index.isin([last, second_to_last]))
#chain together
m = m1 & m2
print (m)
[False False True True]
#filter
df1 = df[m]
print (df1)
col1 col2 col3 col4
2 k 9 1 2
3 j 20 1 2
#get last row, remove unnecessary column
df2 = df1.iloc[[-1]].drop('col2', axis=1)
#convert value to lsit and add missing value
df2['col1'] = df2['col1'].apply(lambda x: list(x) + [np.nan])
print (df2)
col1 col3 col4
3 [j, nan] 1 2
到目前为止,您尝试了什么来实现它?有没有基于查询、groupby和筛选的方法来解决它?我非常不喜欢使用pd生成新的数据帧。dataframe我刚刚添加了另一列,说明为什么我要求使用更有效的方法如果
col1
具有浮点数值,则在输出时,您的解决方案最终会分离整数,如28.6
将变成2,8,6
list@user8034918-不是,这意味着有字符串,请检查它list('28.6')
因此需要df['col1']=df['col1'].astype(float)