[英]Drop duplicates in pandas Dataframe
我有一個 DataFrame
Type Numer master width
xyz 465_0 123 305
xyz 465_0 123 305
xyz 465_0 123 305
xyz 465_0 123 315
xyz 465_1 123 305
xyz 465_1 123 305
xyz 465_1 123 305
xyz 465_1 123 315
xyz 465_2 123 305
xyz 465_2 123 305
xyz 465_2 123 305
xyz 465_2 123 315
xyz 465_3 123 305
xyz 465_3 123 305
xyz 465_3 123 305
xyz 465_3 123 315
由此我需要以下 DataFrame
Type Numer master width
xyz 465_0 123 305
xyz 465_1 123 305
xyz 465_2 123 305
xyz 465_3 123 315
我的嘗試是:
df[['Numer1', 'dig']] = df['Numer'].str.split("_", expand=True)
df = df.drop('Numer', axis = 1)
df.drop_duplicates()
但它沒有給我結果。 我想以通用的方式編寫它,因為我有多種類型。
數據:
{'Type': ['xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz',
'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz'],
'Numer': ['465_0', '465_0', '465_0', '465_0', '465_1', '465_1', '465_1', '465_1',
'465_2', '465_2', '465_2', '465_2', '465_3', '465_3', '465_3', '465_3'],
'master': [123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123],
'width': [305, 305, 305, 315, 305, 305, 305, 315, 305, 305, 305, 315, 305, 305, 305, 315]}
我們可以使用groupby
+ cumcount
為每個“Numer”創建特定於組的排名; 然后過濾“Numer”中的后綴與組中排名匹配的行:
out = df[df['Numer'].str.split('_').str[1].astype(int) == df.groupby('Numer').cumcount()].drop(columns='rank')
Output:
Type Numer master width
0 xyz 465_0 123 305
5 xyz 465_1 123 305
10 xyz 465_2 123 305
15 xyz 465_3 123 315
我從你的問題中了解到,你正試圖將每個Numer
組中的width
模式“折疊”成一個DataFrame
,它只有唯一的組( Numer
)值和相同的width
模式
一種方法是在反轉組后使用itertools
庫中的zip_longest
function -
from itertools import zip_longest
rev_zip_longest = list(zip_longest(*[reversed(df[col].unique()) for col in df.columns]))
# [('xyz', '465_3', 123, 315),
# (None, '465_2', None, 305),
# (None, '465_1', None, None),
# (None, '465_0', None, None)]
df2 = pd.DataFrame(rev_zip_longest)
df2.columns = df.columns
df2 = df2.fillna(method='ffill')
# Type Numer master width
# 0 xyz 465_3 123.0 315.0
# 1 xyz 465_2 123.0 305.0
# 2 xyz 465_1 123.0 305.0
# 3 xyz 465_0 123.0 305.0
此代碼也適用:
res = pd.concat([g.take([i.split('_')[1]]) for i,g in df.groupby('Numer')])
print(res)
'''
Type Numer master width
0 xyz 465_0 123 305
5 xyz 465_1 123 305
10 xyz 465_2 123 305
15 xyz 465_3 123 315
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.