Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大熊猫如何在复杂条件下进行装箱作业_Python_Pandas_Dataframe - Fatal编程技术网

Python 大熊猫如何在复杂条件下进行装箱作业

Python 大熊猫如何在复杂条件下进行装箱作业,python,pandas,dataframe,Python,Pandas,Dataframe,我有如下的数据帧 age type days 1 a 1 2 b 3 2 b 4 3 a 5 4 b 2 6 c 1 7 f 0 7 d 4 10 e 2 14 a 1 首先,我想谈谈年龄 年龄 [0~4] age type days 1 a 1 2 b 3 2 b 4 3 a 5 4 b 2 然

我有如下的数据帧

age  type days 
1    a    1
2    b    3
2    b    4
3    a    5   
4    b    2
6    c    1
7    f    0
7    d    4
10   e    2
14   a    1
首先,我想谈谈年龄

年龄

[0~4]

age  type days  
1    a    1
2    b    3
2    b    4
3    a    5   
4    b    2
然后用
type

   sum count
a   6   2
b   9   3
c   0   0
d   0   0
e   0   0
f   0   0
然后我想把这个方法应用到另一个binn中

[5~9] [11~14]

我期望的结果如下

   [0~4]         [5~9]      [10~14]
   sum count  sum count  sum count
a   6   2      0   0      1   1
b   9   3      0   0      0   0
c   0   0      1   1      0   0
d   0   0      4   1      0   0
e   0   0      0   0      2   1
f   0   0      0   1      0   0
如何做到这一点?
这对我来说非常复杂。

我们将使用一些堆叠和分组操作来获得所需的输出

string_ = io.StringIO('''age  type days 
                         1    a    1
                         2    b    3
                         2    b    4
                         3    a    5   
                         4    b    2
                         6    c    1
                         7    f    0
                         7    d    4
                         10   e    2
                         14   a    1''')
df = pd.read_csv(string_, sep='\s+')

df['age_bins'] = pd.cut(df['age'], [0,4,9,14])

df_stacked = df.groupby(['age_bins', 'type']).agg({'days': np.sum,
                         'type': 'count'}).transpose().stack().fillna(0)
df_stacked.rename(index={'days': 'sum', 'type': 'count'}, inplace=True)

>>> df_stacked
age_bins    (0, 4]  (4, 9]  (9, 14]
      type                         
sum   a        6.0     0.0      1.0
      b        9.0     0.0      0.0
      c        0.0     1.0      0.0
      d        0.0     4.0      0.0
      e        0.0     0.0      2.0
      f        0.0     0.0      0.0
count a        2.0     0.0      1.0
      b        3.0     0.0      0.0
      c        0.0     1.0      0.0
      d        0.0     1.0      0.0
      e        0.0     0.0      1.0
      f        0.0     1.0      0.0
>>> df_stacked.unstack(level=0)
age_bins (0, 4]      (4, 9]      (9, 14]     
          count  sum  count  sum   count  sum
type                                         
a           2.0  6.0    0.0  0.0     1.0  1.0
b           3.0  9.0    0.0  0.0     0.0  0.0
c           0.0  0.0    1.0  1.0     0.0  0.0
d           0.0  0.0    1.0  4.0     0.0  0.0
e           0.0  0.0    0.0  0.0     1.0  2.0
f           0.0  0.0    1.0  0.0     0.0  0.0
这不会产生您列出的确切输出,但它是类似的,我认为从中索引和检索数据会更容易。或者,您可以使用以下方法获得类似于所需输出的内容

string_ = io.StringIO('''age  type days 
                         1    a    1
                         2    b    3
                         2    b    4
                         3    a    5   
                         4    b    2
                         6    c    1
                         7    f    0
                         7    d    4
                         10   e    2
                         14   a    1''')
df = pd.read_csv(string_, sep='\s+')

df['age_bins'] = pd.cut(df['age'], [0,4,9,14])

df_stacked = df.groupby(['age_bins', 'type']).agg({'days': np.sum,
                         'type': 'count'}).transpose().stack().fillna(0)
df_stacked.rename(index={'days': 'sum', 'type': 'count'}, inplace=True)

>>> df_stacked
age_bins    (0, 4]  (4, 9]  (9, 14]
      type                         
sum   a        6.0     0.0      1.0
      b        9.0     0.0      0.0
      c        0.0     1.0      0.0
      d        0.0     4.0      0.0
      e        0.0     0.0      2.0
      f        0.0     0.0      0.0
count a        2.0     0.0      1.0
      b        3.0     0.0      0.0
      c        0.0     1.0      0.0
      d        0.0     1.0      0.0
      e        0.0     0.0      1.0
      f        0.0     1.0      0.0
>>> df_stacked.unstack(level=0)
age_bins (0, 4]      (4, 9]      (9, 14]     
          count  sum  count  sum   count  sum
type                                         
a           2.0  6.0    0.0  0.0     1.0  1.0
b           3.0  9.0    0.0  0.0     0.0  0.0
c           0.0  0.0    1.0  1.0     0.0  0.0
d           0.0  0.0    1.0  4.0     0.0  0.0
e           0.0  0.0    0.0  0.0     1.0  2.0
f           0.0  0.0    1.0  0.0     0.0  0.0

如果您不太关心列顺序,因为计数和总和没有在bin下配对,请考虑一个带有pd的
pivot\u表
。cut。通过操纵,您可以更改这种顺序

df['bin'] = pd.cut(df.age, [0,4,9,14])

pvtdf = df.pivot_table(index='type', columns=['bin'], values='days', 
                       aggfunc=('count', 'sum')).fillna(0)

#       count                   sum               
# bin  (0, 4] (4, 9] (9, 14] (0, 4] (4, 9] (9, 14]
# type                                            
# a       2.0    0.0     1.0    6.0    0.0     1.0
# b       3.0    0.0     0.0    9.0    0.0     0.0
# c       0.0    1.0     0.0    0.0    1.0     0.0
# d       0.0    1.0     0.0    0.0    4.0     0.0
# e       0.0    0.0     1.0    0.0    0.0     2.0
# f       0.0    1.0     0.0    0.0    0.0     0.0