[英]Pandas - Find longest streak of string values in column together with row id
我正在嘗試找到最長的字符串值條紋以及它的位置。 我擁有的數據格式如下:
ID Datetime Name
0 Date1, Harald
1 Date2, Harald
2 Date3, Esther
3 Date4, Steve
4 Date5, Esther
5 Date6, Esther
6 Date7, Esther
預期的 output 將是這個,字符串值和日期或行號的最大條紋
Output = {
Harald: 2, 0 or Date1
Esther: 3, 4 or Date5
Steve: 1, 3 or Date4
}
我最接近的解決方案是:
def getLongestStreak():
s = df['Name']
for index, (key, group) in enumerate(groupby(s.tolist())):
grouplength = len(list(group))
if key in longestStreakDict:
if longestStreakDict[key][0] < grouplength:
longestStreakDict[key] = grouplength, index
else:
longestStreakDict[key] = grouplength, index
不幸的是,這只會返回最長的連續記錄以及 groupby 迭代器中組更改的次數,它也使用 itertools 並且對於大型數據集來說會很慢。
{'Harald': (2, 1), 'Esther': (3, 3), 'Steve': (1, 2)}
有誰知道也返回正確行索引的非迭代解決方案?
我們可以使用Series.cumsum
+ Series.shift
根據連續名稱創建組(見詳情)。 然后您可以使用GroupBy.agg
創建一個 dataframe 與每個組的大小。 , 每組的第一個索引和日期時間值。 使用DataFrame.sort_values
按大小對 dataframe 進行排序並刪除重復項(您可以使用DataFrame.drop_duplicates
)並刪除具有相同名稱的較小組。 將列轉換為 str。 (如果您的實際數據不是 str,您可能還需要轉換 Datetime)。 然后您可以使用Series.str.cat
加入列。 最后,我們可以使用Series.to_dict
+ DataFrame.set_index
得到字典
groups=df['Name'].ne(df['Name'].shift()).cumsum()
df_agg= ( df.groupby(groups,sort=False).agg(Name=('Name','first'),
Datemin=('Datetime','first'),
length=('Name','size'),
idxmin=('ID','idxmin'))
.sort_values('length',ascending=False)
.drop_duplicates('Name')
)
df_agg['j1']=df_agg['length'].astype(str).str.cat(df_agg['idxmin'].astype(str),sep=',')
df_agg['j']=df_agg['j1'].str.cat(df_agg['Datemin'],sep=' or ')
print(df_agg)
Name length idxmin Datemin j1 j
Name
4 Esther 3 4 Date5 3,4 3,4 or Date5
1 Harald 2 0 Date1 2,0 2,0 or Date1
3 Steve 1 3 Date4 1,3 1,3 or Date4
my_dict=df_agg.set_index('Name')['j'].to_dict()
print(my_dict)
Output
{'Esther': '3,4 or Date5', 'Harald': '2,0 or Date1', 'Steve': '1,3 or Date4'}
細節:
print(groups)
0 1
1 1
2 2
3 3
4 4
5 4
6 4
Name: Name, dtype: int64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.