Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:查找出现在特定列中的元素的首次出现_Python_Pandas - Fatal编程技术网

Python 熊猫:查找出现在特定列中的元素的首次出现

Python 熊猫:查找出现在特定列中的元素的首次出现,python,pandas,Python,Pandas,假设我有以下数据帧: df_raw = pd.DataFrame({"id": [102, 102, 103, 103, 103], "val1": [9,2,4,7,6], "val2": [np.nan, 3, np.nan, 4, 5], "val3": [4, np.nan, np.nan, 5, 1], "date": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Ti

假设我有以下数据帧:

df_raw = pd.DataFrame({"id": [102, 102, 103, 103, 103], "val1": [9,2,4,7,6], "val2": [np.nan, 3, np.nan, 4, 5], "val3": [4, np.nan, np.nan, 5, 1], "date": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Timestamp(2003, 8, 9), pd.Timestamp(2005, 2, 3)]})
我想访问每个
id
第一次出现的行。因此,这些行将是:

df_first = pd.DataFrame({"id": [102, 103], "val1": [9, 4], "val2": [np.nan, np.nan], "val3": [4, np.nan], "date": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2003, 4, 4)]})
基本上,最后我想要实现的是填充每个
id
第一次出现的
NaN
s。因此,最终的数据帧可能是:

df_processed = pd.DataFrame({"id": [102, 102, 103, 103, 103], "val1": [9,2,4,7,6], "val2": [-1, 3, -1, 4, 5], "val3": [4, np.nan, -1, 5, 1], "date": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Timestamp(2003, 8, 9), pd.Timestamp(2005, 2, 3)]})

一个重要的注意事项是,行已经按id和日期分组,并以升序方式排序。因此,它们与提供的示例完全相同。

IIUC使用
drop\u duplicates
然后
concat

df1=df_raw.drop_duplicates('id').fillna(-1)
target=pd.concat([df1,df_raw.loc[~df_raw.index.isin(df1.index)]]).sort_index()
target
        date   id  val1  val2  val3
0 2002-01-01  102     9  -1.0   4.0
1 2002-03-03  102     2   3.0   NaN
2 2003-04-04  103     4  -1.0  -1.0
3 2003-08-09  103     7   4.0   5.0
4 2005-02-03  103     6   5.0   1.0
可以与布尔行索引一起使用:

mask = ~df_raw['id'].duplicated()
val_cols = ['val2', 'val3']

df_raw.loc[mask, val_cols] = df_raw.loc[mask, val_cols].fillna(-1)

print(df_raw)

    id  val1  val2  val3       date
0  102     9  -1.0   4.0 2002-01-01
1  102     2   3.0   NaN 2002-03-03
2  103     4  -1.0  -1.0 2003-04-04
3  103     7   4.0   5.0 2003-08-09
4  103     6   5.0   1.0 2005-02-03