簡體   English   中英

Pandas - 在列中查找最長的字符串值連串以及行 ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM