簡體   English   中英

在 groupby agg 中使用列名列表?

[英]Use a list of column names in groupby agg?

概括:

我有很多包含數據 (data_cols) 和文本 (text_cols) 的列,我想通過引用列名列表來執行以下操作,但無法弄清楚: df.groupby('id', as_index=False).agg({data_cols: 'sum', text_cols: 'first'})

解釋:

我有一個 dataframe 約 30 列,一些列包含值,其他列包含文本。 我想對具有相同 ID 的所有值求和,並讓文本使用第一個條目。 我可以通過使用 groupby 來實現:

d = {'id': ['a', 'a', 'b', 'c'], 'value1': [1, 2, 3, 4], 'value2': [5, 6, 7, 8], 'text1': ['w', 'x', 'y', 'z']}
df = pd.DataFrame(d)

  id  value1  value2 text1
0  a       1       5     w
1  a       2       6     x
2  b       3       7     y
3  c       4       8     z

df.groupby('id', as_index=False).agg({'value1': 'sum', 'value2': 'sum', 'text1': 'first'})

  id  value1  value2 text1
0  a       3      11     w
1  b       3       7     y
2  c       4       8     z

這正是我想要實現的,除了我有很多列並且不希望寫出所有列名。 所以我嘗試了不同的方法來引用多個列,但我沒有得到任何工作。

data_cols = df.columns[1:3]
text_cols = set(df.columns) - set(data_cols)

df.groupby('id', as_index=False).agg({data_cols: 'sum', text_cols: 'first'})

在這里,我得到TypeError: unhashable type: 'Index' ,所以我想我可以通過使用tuple來避免這種情況:

data_cols = tuple(df.columns[1:3])
text_cols = tuple(set(df.columns) - set(data_cols)) #I have many data columns and some text columbs before and after them

這給了我: SpecificationError: Column(s) [('text1', 'id'), ('value1', 'value2')] do not exist我認為它認為('value1', 'value2')是一個單一的列,而不是將其解包到兩列中。 有什么方法或格式可以避免這種情況嗎?

或者,我可以將 df 拆分為 2 個 df:df_values 和 df_text,對 df_values 進行分組,然后將它們重新組合在一起,但這看起來很麻煩,我認為有更好的方法。

通過dict.fromkeys創建字典並合並它們,最后傳遞給agg

data_cols = df.columns[1:3]
text_cols = set(df.columns) - set(data_cols)
d1 = dict.fromkeys(data_cols, 'sum')
d2 = dict.fromkeys(text_cols, 'first')

#https://stackoverflow.com/questions/38987
d = {**d1, **d2}

df.groupby('id', as_index=False).agg(d)

您需要先將列名轉換為具有所需操作的字典,然后合並該字典。

(
    df.groupby('id', as_index=False)
    .agg({**{e:'sum' for e in data_cols}, **{e:'first' for e in text_cols}})
)

如果您將列作為列表。 我強烈建議使用以下方法 -

df.groupby('col', as_index=False)[columns_list].agg('sum')

PS - as_index=False是一個重要的參數

對我來說就像一個魅力!

暫無
暫無

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

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