簡體   English   中英

Pandas 對 dataframe 進行采樣,但根據列將多行視為單行

[英]Pandas sampling a dataframe but treating multiple rows as a single row based on column

考慮以下玩具代碼,它執行我的實際問題的簡化版本:

import pandas

df = pandas.DataFrame(
    {
        'n_event':     [1,2,3,4,5],
        'some column': [0,1,2,3,4],
    }
)

df = df.set_index(['n_event'])
print(df)

resampled_df = df.sample(frac=1, replace=True)
print(resampled_df)

顧名思義, resampled_df是原始版本的重新采樣版本(帶替換)。 這正是我想要的。 前面代碼的示例 output 是

         some column
n_event             
1                  0
2                  1
3                  2
4                  3
5                  4
         some column
n_event             
4                  3
1                  0
4                  3
4                  3
2                  1

現在對於我的實際問題,我有以下 dataframe:

import pandas

df = pandas.DataFrame(
    {
        'n_event':     [1,1,2,2,3,3,4,4,5,5],
        'n_channel':   [1,2,1,2,1,2,1,2,1,2],
        'some column': [0,1,2,3,4,5,6,7,8,9],
    }
)

df = df.set_index(['n_event','n_channel'])
print(df)

看起來像

                   some column
n_event n_channel             
1       1                    0
        2                    1
2       1                    2
        2                    3
3       1                    4
        2                    5
4       1                    6
        2                    7
5       1                    8
        2                    9

我想做與以前完全相同的操作,使用替換重新采樣,但將具有相同n_event的每組行視為單個實體。 我想要做的手工構建示例如下所示:

                   some column
n_event n_channel             
2       1                    2
        2                    3
2       1                    2
        2                    3
3       1                    4
        2                    5
1       1                    0
        2                    1
5       1                    8
        2                    9

正如所見,每個n_event都被視為一個整體,並且每個事件中的事物都沒有混淆。

我怎樣才能做到這一點而不通過蠻力進行(即沒有for循環等)?

我嘗試使用df.sample(frac=1, replace=True, ignore_index=False)和一些使用group_by的東西但沒有成功。

pivot() / melt()序列對你有用嗎?

使用pivot()從長到寬(使每個組成為單行)。
進行抽樣。
然后使用melt()從寬變長。

沒有時間想出一個完整的答案,但我想我會把這個想法告訴你,以防它對你有所幫助。

按照jch 的建議,我能夠通過結合pivotstack找到解決方案:

import pandas

df = pandas.DataFrame(
    {
        'n_event':     [1,1,2,2,3,3,4,4,5,5],
        'n_channel':   [1,2,1,2,1,2,1,2,1,2],
        'some column': [0,1,2,3,4,5,6,7,8,9],
        'other col':   [5,6,4,3,2,5,2,6,8,7],
    }
)

resampled_df = df.pivot(
    index = 'n_event',
    columns = 'n_channel',
    values = set(df.columns) - {'n_event','n_channel'},
)
resampled_df = resampled_df.sample(frac=1, replace=True)
resampled_df = resampled_df.stack()
print(resampled_df)

暫無
暫無

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

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