簡體   English   中英

pandas DataFrame 中的新列,它計算以下所有值的列值的出現次數

[英]New column in pandas DataFrame which counts occurrences of a column value for all values below

我正在使用一個相當大的數據集(500k 行),並希望計算 ID 的運行出現次數。

數據集包含一列帶有 ID 的列和一列帶有每個 ID 的總出現次數。 我想添加一個新列,列出每個 ID 在當前行下方的列中出現的頻率。 本質上,我想添加一個 python 代碼,它為每一行計算“發生后”,如下面的屏幕截圖所示。

總出現次數 -> Excel 比較

發生后-> Excel 比較

我嘗試循環遍歷 dataframe 的一個子集,但這非常慢(而且也不是最佳實踐,正如我所讀)。 我認為 apply 方法的計算效率會更高,但是我想不出一個 function 考慮到當前行 position 以確保只考慮當前行以下的值。

ElPadrino,我創建了一個包含您的 ID 列的 Dataframe 來模擬您的問題。 為了不遍歷所有 DataFrame,讓我們遍歷它的唯一值。 因此,我們將 ID 列等於唯一值的所有行設置為,並獲取出現的索引。

有了索引,我們可以迭代並計算索引等於或高於索引時出現的次數。

在此示例中,我計算了Total Occurrences 列以具有與您的圖像完全相同的 output。

pandas.DataFrame.loc 文檔可以幫助您更好地理解它,但基本上我們可以訪問 DataFrame 正是我們想要給出索引的地方。

df.loc[索引,'列']

df['Total Occurences'] = ''
df['Occurences after'] = ''

for i in df['ID'].unique():
    df.loc[df['ID'] == i, 'Total Occurences'] = df[df['ID'] == i].value_counts().values[0]
    indexes = df[df['ID'] == i].index.values
    for index in indexes:
        df.loc[index, 'Occurences after'] = df[(df.index >= index) & (df['ID'] == i)].value_counts().values[0]

這是 output:

在此處輸入圖像描述

使用以下代碼:

df['Total Occ'] = df.groupby('ID').ID.transform('count')
df['Occ After'] = df[::-1].groupby('ID').cumcount() + 1

(我縮短了列名)。

如您所見,只有 2 個單行(每列一個),沒有任何循環(如在另一個答案中)。

對於您的數據樣本,結果是:

     ID  Total Occ  Occ After
0  C101          3          3
1  D101          4          4
2  C101          3          2
3  D101          4          3
4  E101          2          2
5  F101          1          1
6  D101          4          2
7  C101          3          1
8  D101          4          1
9  E101          2          1
import pandas as pd
id_df = pd.read_csv(file_path)
total_occ = []
occ_after = []
for i in range(len(id_df['ID'])):
    total_occ.append(id_df['ID'].value_counts()[id_df['ID'][i]])
    occ_after.append(list(id_df['ID'][i+1:]).count(id_df['ID'][i])+1) 
id_df['Total Occurences'] = total_occ
id_df['Occurences After'] = occ_after
print(id_df)
ID  Total Occurences    Occurences After
0   C101    3   3
1   D101    4   4
2   C101    3   2
3   D101    4   3
4   E101    2   2
5   F101    1   1
6   D101    4   2
7   C101    3   1
8   D101    4   1
9   E101    2   1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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