使用 pandas 的文本文件中的最大数字
Largest Number from a text file using pandas
我使用数据框创建了列。我需要相应 ID 的 SNR 中的五个最大数字。例如,对于 J07451689+2804046,我需要五个最大的,它应该继续到下一个 ID,即 J05062845+7149258。我正在尝试切片,但我被困在这里:
import pandas as pd
df = pd.read_table("Ident_new_test.txt",sep=",",header=None)
print(df)
df.shape
for i in range(0,N):
df1 = df.loc[:, "1":"1":2]
print(df1)´´´
ID SNR
J07451689+2804046 200
J07451689+2804046 217
J07451689+2804046 257
J07451689+2804046 200
J07451689+2804046 181
J07451689+2804046 206
J07451689+2804046 198
J07451689+2804046 222
J05062845+7149258 281
J05062845+7149258 397
J15170588+7149258 431
J15170588+7149258 347
J15170588+7149258 411
J15170588+7149258 495
J18255915+6533486 257
J18255915+6533486 317
J18255915+6533486 349
J18255915+6533486 321
J18255915+6533486 403
J18255915+6533486 332
J19420540+5029382 328
J19420540+5029382 305
J19420540+5029382 721
J19420540+5029382 350 ´´´
IIUC,
out = df.groupby('ID')['SNR'].nlargest(5).reset_index('ID')
print(out)
# Output
ID SNR
9 J05062845+7149258 397
8 J05062845+7149258 281
2 J07451689+2804046 257
7 J07451689+2804046 222
1 J07451689+2804046 217
5 J07451689+2804046 206
0 J07451689+2804046 200
13 J15170588+7149258 495
10 J15170588+7149258 431
12 J15170588+7149258 411
11 J15170588+7149258 347
18 J18255915+6533486 403
16 J18255915+6533486 349
19 J18255915+6533486 332
17 J18255915+6533486 321
15 J18255915+6533486 317
22 J19420540+5029382 721
23 J19420540+5029382 350
20 J19420540+5029382 328
21 J19420540+5029382 305
注意:如果您想保持索引有序,请在 reset_index('ID')
之后附加 .sort_index()
或 sort_index(ignore_index=True)
。
更新
I also need the deleted lines as a separate output.
使用布尔掩码:
m = df.index.isin(df.groupby('ID')['SNR'].nlargest(5).reset_index('ID').index)
df1 = df.loc[m] # nlargest(5)
df2 = df.loc[~m] # excluded rows
我使用数据框创建了列。我需要相应 ID 的 SNR 中的五个最大数字。例如,对于 J07451689+2804046,我需要五个最大的,它应该继续到下一个 ID,即 J05062845+7149258。我正在尝试切片,但我被困在这里:
import pandas as pd
df = pd.read_table("Ident_new_test.txt",sep=",",header=None)
print(df)
df.shape
for i in range(0,N):
df1 = df.loc[:, "1":"1":2]
print(df1)´´´
ID SNR
J07451689+2804046 200
J07451689+2804046 217
J07451689+2804046 257
J07451689+2804046 200
J07451689+2804046 181
J07451689+2804046 206
J07451689+2804046 198
J07451689+2804046 222
J05062845+7149258 281
J05062845+7149258 397
J15170588+7149258 431
J15170588+7149258 347
J15170588+7149258 411
J15170588+7149258 495
J18255915+6533486 257
J18255915+6533486 317
J18255915+6533486 349
J18255915+6533486 321
J18255915+6533486 403
J18255915+6533486 332
J19420540+5029382 328
J19420540+5029382 305
J19420540+5029382 721
J19420540+5029382 350 ´´´
IIUC,
out = df.groupby('ID')['SNR'].nlargest(5).reset_index('ID')
print(out)
# Output
ID SNR
9 J05062845+7149258 397
8 J05062845+7149258 281
2 J07451689+2804046 257
7 J07451689+2804046 222
1 J07451689+2804046 217
5 J07451689+2804046 206
0 J07451689+2804046 200
13 J15170588+7149258 495
10 J15170588+7149258 431
12 J15170588+7149258 411
11 J15170588+7149258 347
18 J18255915+6533486 403
16 J18255915+6533486 349
19 J18255915+6533486 332
17 J18255915+6533486 321
15 J18255915+6533486 317
22 J19420540+5029382 721
23 J19420540+5029382 350
20 J19420540+5029382 328
21 J19420540+5029382 305
注意:如果您想保持索引有序,请在 reset_index('ID')
之后附加 .sort_index()
或 sort_index(ignore_index=True)
。
更新
I also need the deleted lines as a separate output.
使用布尔掩码:
m = df.index.isin(df.groupby('ID')['SNR'].nlargest(5).reset_index('ID').index)
df1 = df.loc[m] # nlargest(5)
df2 = df.loc[~m] # excluded rows