从pandas dataframe中获取两个binned变量的联合频率?

gcuhipw9  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(82)

假设我有一个dataframe,其中包含两个时间序列变量,如下所示:
| 温度|湿度|
| --------------|--------------|
| 17.6 |八十八|
| 22.1 |八十一|
| 13.6 |八十八|
| 26.4 |七十一|
| 25.6 |七十二|
下面是它的pd.DataFrame

data = {
    'Temperature': [17.6, 22.1, 13.6, 26.4, 25.6],
    'Humidity': [88, 81, 88, 71, 72]
}

df = pd.DataFrame(data)

我想得到一个表,其中有这两个变量,作为轴,和值的频率(名义或相对)的组合条件。
例如,最终输出将被格式化,其中分箱温度作为列,分箱湿度作为索引:
| | 0-4 |4-8|8-12|12-16|16-20|二十到二十四岁|二十四到二十八|28-32|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 0-10 |||||||||
| 十到二十|||||||||
| 20-30|||||||||
| 三四十岁|||||||||
| 四五十岁|||||||||
| 五六十|||||||||
| 六七十|||||||||
| 七八十|||||||||
| 八九十|||||||||
| 九十到一百|||||||||
我知道如何分箱并获得一个分箱的计数,但我真的不知道如何计算两个分箱条件的组合出现次数。有人能给我指出正确的方向吗?

df['T_binned'] = pd.cut(df['Temperature'],bins=np.arange(0,32,4))
df['H_binned'] = pd.cut(df['Humidity'],bins=np.arange(0,100,10))
counts_T = df.groupby(by='T_binned').count()
counts_H = df.groupby(by='H_binned').count()
j0pj023g

j0pj023g1#

使用crosstab

pd.crosstab(pd.cut(df['Temperature'],bins=np.arange(0,32,4)),
            pd.cut(df['Humidity'],bins=np.arange(0,100,10)))

或所有类别:

pd.crosstab(pd.cut(df['Temperature'],bins=np.arange(0,32,4)),
            pd.cut(df['Humidity'],bins=np.arange(0,100,10)),
            dropna=False
           )

输出:

Humidity     (0, 10]  (10, 20]  (20, 30]  (30, 40]  (40, 50]  (50, 60]  (60, 70]  (70, 80]  (80, 90]
Temperature                                                                                         
(0, 4]             0         0         0         0         0         0         0         0         0
(4, 8]             0         0         0         0         0         0         0         0         0
(8, 12]            0         0         0         0         0         0         0         0         0
(12, 16]           0         0         0         0         0         0         0         0         1
(16, 20]           0         0         0         0         0         0         0         0         1
(20, 24]           0         0         0         0         0         0         0         0         1
(24, 28]           0         0         0         0         0         0         0         2         0
iswrvxsc

iswrvxsc2#

我认为这样做是可行的:

df['count'] = 1

df_group = df.groupby(['T_binned', 'H_binned'])['count'].sum().reset_index()

pd.pivot_table(df_group, index='T_binned', columns='H_binned', values='count')

首先,我们为count创建一个列:

df['count'] = 1

然后我们计算每对bin中的数字:

df_group = df.groupby(['T_binned', 'H_binned'])['count'].sum().reset_index()

最后,我们创建一个 Dataframe ,其中index是温度箱,column是湿度箱,values是每个箱中的计数。

相关问题