添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

返回第一行的非空值。 如果是空值,则返回第一行的外观 python-pandas

1 人关注

我有一个包含以下数据的pandas数据框架。数据按sessionid、datetime(ASC)排序

 df = df.sort_values(['datetime','session_id'],ascending=True)
     x = df.groupby(by="session_id")'om_source'].transform(pd.Series.first_valid_index ) newdf = df[df.index==x]

The first:

它返回第一个非空值 ++但每一列都分开了 ++这不是我在寻找的。

我试图做这样的事情,但不幸的是,这并不奏效。

df.groupby(by="session_id")['om_source']
.transform(first if ( pd.Series.first_valid_index is None  ) else pd.Series.first_valid_index)

你有什么建议吗?(我是潘达的新手,我还在努力理解它背后的 "逻辑")

提前感谢您的时间。

python
pandas
Oscar Copado
Oscar Copado
发布于 2021-03-18
2 个回答
Scott Boston
Scott Boston
发布于 2021-03-18
0 人赞同

你可以创建一个像这样的 "辅助 "列,然后进行排序,然后删除重复的内容。

df.assign(sorthelp=df['source'] == 'NULL/NAN')\
  .sort_values(['sorthelp','datetime','session_id'])\
  .drop_duplicates('session_id')

Output:

   session_id    source                    datetime  sorthelp
3           2   twitter  2021-01-23 11:05:17.289000     False
0           1  facebook  2021-01-23 11:26:34.166000     False
4           3  NULL/NAN  2021-01-23 13:12:32.914000      True

你可以在事后删除帮助列

print(df.assign(sorthelp=df['source'] == 'NULL/NAN')
        .sort_values(['sorthelp','datetime','session_id'])
        .drop_duplicates('session_id')
        .drop('sorthelp', axis=1))

Output:

   session_id    source                    datetime
3           2   twitter  2021-01-23 11:05:17.289000
0           1  facebook  2021-01-23 11:26:34.166000
4           3  NULL/NAN  2021-01-23 13:12:32.914000
    
Andrej Kesely
Andrej Kesely
发布于 2021-03-18
0 人赞同

如果你的时间已经整理好了,你可以做。

print(
    df.iloc[
        df.groupby("session_id")["source"].apply(
            lambda x: x.first_valid_index()
            if not x.first_valid_index() is None
            else x.index[0]

Prints:

   session_id    source                    datetime
0           1  facebook  2021-01-23 11:26:34.166000
3           2   twitter  2021-01-23 11:05:17.289000
4           3       NaN  2021-01-23 13:12:32.914000

或者使用:=操作符 (Python 3.8以上)

print(
    df.iloc[
        df.groupby("session_id")["source"].apply(
            lambda x: fi
            if not (fi := x.first_valid_index()) is None