ค้นหาไม่ใช่ค่า NaN แรกใน Pandas


1

ฉันมีดาต้าดาต้าชื่อของนุ่นเช่นนั้น

|user_id|value|No|
|:-:|:-:|:-:|
|id1|100|1|
|id1|200|2|
|id1|250|3|
|id2|NaN|1|
|id2|100|2|
|id3|400|1|
|id3|NaN|2|
|id3|200|3|
|id4|NaN|1|
|id4|NaN|2|
|id4|300|3|.

จากนั้นฉันต้องการชุดข้อมูลต่อไปนี้:

|user_id|value|No|NewNo|
|:-:|:-:|:-:|:-:|
|id1|100|1|1|
|id1|200|2|2|
|id1|250|3|3|
|id2|100|2|1|
|id3|400|1|1|
|id3|NaN|2|2|
|id3|200|3|3|
|id4|300|3|1|

คือฉันต้องการลบค่า NaN โดยที่ค่าแรกของ user_id ไม่ใช่ค่า NaN ขอบคุณ.

คำตอบ:


3

คุณสามารถจัดกลุ่มตาม & amp; ไปข้างหน้าเติมคอลัมน์ค่า ค่า Null ในข้อมูลที่แปลงแล้วแสดงค่าจากจุดเริ่มต้นสำหรับแต่ละกลุ่มที่เป็นโมฆะ กรองแถวที่เป็นโมฆะ

df2 = df[df.groupby('user_id').value.ffill().apply(pd.notnull)].copy()
# application of copy here creates a new data frame and allows us to assign
# values to the result (df2). This is needed to create the column `NewNo` 
# in the next & final step
# df2 outputs:
   user_id  value  No
0    'id1'  100.0   1
1    'id1'  200.0   2
2    'id1'  250.0   3
4    'id2'  100.0   2
5    'id3'  400.0   1
6    'id3'    NaN   2
7    'id3'  200.0   3
10   'id4'  300.0   3

ผลิต NewNo คอลัมน์โดยใช้การจัดอันดับภายในกลุ่ม

df2['NewNo'] = df2.groupby('user_id').No.rank()

# df2 outputs:

   user_id  value  No  NewNo
0    'id1'  100.0   1    1.0
1    'id1'  200.0   2    2.0
2    'id1'  250.0   3    3.0
4    'id2'  100.0   2    1.0
5    'id3'  400.0   1    1.0
6    'id3'    NaN   2    2.0
7    'id3'  200.0   3    3.0
10   'id4'  300.0   3    1.0

0

groupby + first_valid_index + cumcount

คุณสามารถคำนวณดัชนีสำหรับค่าที่ไม่เป็นค่าแรกตามกลุ่มจากนั้นใช้การจัดทำดัชนีบูลีน:

# use transform to align groupwise first_valid_index with dataframe
firsts = df.groupby('user_id')['value'].transform(pd.Series.first_valid_index)

# apply Boolean filter
res = df[df.index >= firsts]

# use groupby + cumcount to add groupwise labels
res['NewNo'] = res.groupby('user_id').cumcount() + 1

print(res)

   user_id  value  No  NewNo
0      id1  100.0   1      1
1      id1  200.0   2      2
2      id1  250.0   3      3
4      id2  100.0   2      1
5      id3  400.0   1      1
6      id3    NaN   2      2
7      id3  200.0   3      3
10     id4  300.0   3      1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.