计算每行数据帧中第一个有效值和最后一个有效值之间的差?

2024-05-17 17:11:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找出每行DataFrame中第一个有效值和最后一个有效值之间的差异。在

我有一个工作代码与for循环,并寻找更快的东西。 下面是我目前正在做的一个例子:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    np.arange(16).astype(np.float).reshape(4, 4),
    columns=['a', 'b', 'c', 'd'])
# Fill some NaN
df.loc[0, ['a', 'd']] = np.nan
df.loc[1, ['c', 'd']] = np.nan
df.loc[2, 'b'] = np.nan
df.loc[3, :] = np.nan

print(df)
#    a    b     c     d
# 0  NaN  1.0   2.0   NaN
# 1  4.0  5.0   NaN   NaN
# 2  8.0  NaN  10.0  11.0
# 3  NaN  NaN   NaN   NaN

diffs = pd.Series(index=df.index)
for i in df.index:
    row = df.loc[i]
    min_i = row.first_valid_index()
    max_i = row.last_valid_index()
    if min_i is None or min_i == max_i:  # 0 or 1 valid values
        continue
    diffs[i] = df.loc[i, max_i] - df.loc[i, min_i]

df['diff'] = diffs
print(df)

#    a    b     c     d  diff
# 0  NaN  1.0   2.0   NaN   1.0
# 1  4.0  5.0   NaN   NaN   1.0
# 2  8.0  NaN  10.0  11.0   3.0
# 3  NaN  NaN   NaN   NaN   NaN

Tags: importdataframedfforindexnpnanmin
2条回答

熊猫让你的生活更轻松,一次一个方法(first_valid_values())。请注意,您必须删除所有具有allNaN值的行(无论如何,没有必要使用这些值):

对于第一个有效值:

a= [df.ix[x,i] for x,i in enumerate(df.apply(lambda row: row.first_valid_index(), axis=1))]

对于最后一个有效值:

^{pr2}$

减去得到最终结果:

a-b

一种方法是back and forward fill丢失的值,然后比较第一行和最后一行。在

df2 = df.fillna(method='ffill', axis=1).fillna(method='bfill', axis=1)
df['diff'] = df2.ix[:, -1] - df2.ix[:, 0]

如果您想在一行中完成,而不创建新的数据帧:

^{pr2}$

相关问题 更多 >