首页 > 解决方案 > 根据更改的列条件在数据框中添加行

问题描述

我有一个看起来像这样的数据框。

          name            Datetime            col_3          col_4        
8       'Name 1'     2017-01-02T00:00:00       160           1600          
9       'Name 1'     2017-01-02T00:00:00       160           1600          
10      'Name 1'     2017-01-03T00:00:00       160           1800          
..                   ...     ...          ...       ...
150     'Name 2'     2004-10-13T00:00:00       160           1600          
151     'Name 2'     2004-10-14T00:00:00       160           1600          
152     'Name 2'     2004-10-15T00:00:00       160           1800       
..                   ...     ...          ...       ...
435     'Name 3'     2009-01-02T00:00:00       160           1600          
436     'Name 3'     2009-01-02T00:00:00       170           1500          
437     'Name 3'     2009-01-03T00:00:00       160           1800
..                   ...     ...          ...       ...

本质上,我想删除“名称”列,并且每次“名称-#”字段更改时我想添加一行,仅包含“名称-#”:

                 Datetime            col_2         col_3        
    7            'Name 1'
    8       2017-01-02T00:00:00       160           1600          
    9       2017-01-02T00:00:00       160           1600                   
    ..                ...     ...          ...       ...
    149          'Name 2'
    150     2004-10-13T00:00:00       160           1600          
    151     2004-10-14T00:00:00       160           1600              
    ..                   ...     ...          ...       ...
    435          'Name 3'          
    436     2009-01-02T00:00:00       170           1500          
    437     2009-01-03T00:00:00       160           1800
    ..                ...     ...          ...       ...

我知道如何在名称列更改后添加行,但我需要自动化添加日期时间列中的“名称-#”字段的过程,以便可以通过代码放置相同样式的不同数据。任何帮助将非常感激。谢谢!

标签: python-3.xpandasdataframeloopsvalidation

解决方案


我想你所追求的是groupby

df.groupby('name')

所以你可以做

for name, dfsub in df.groupby('name'):
    ...

这将允许您单独处理每个组

一个例子

import pandas as pd

df = pd.DataFrame( {
   'Name': ['a','a','a','b','b','b','b','c','c','d','d','d'],
   'B': [5,5,6,7,5,6,6,7,7,6,7,7],
   'C': [1,1,1,1,1,1,1,1,1,1,1,1]
    } )

给出一个数据框

   Name B   C
0   a   5   1
1   a   5   1
2   a   6   1
3   b   7   1
4   b   5   1
5   b   6   1
6   b   6   1
7   c   7   1
8   c   7   1
9   d   6   1
10  d   7   1
11  d   7   1

现在我们可以看看 groupby 的输出。循环中的 groupby 返回两个内容,第一个是组名,第二个是数据帧的子集,其中包含按其分组的数据。

for name, dfsub in df.groupby('Name'):
    print("Name is :"+name)
    dfsub1 = dfsub.drop(‘Name’, axis=1)
    print(dfsub1)
    print() # new line for clarity

这给了

Name is :a
      B  C
0    5  1
1    5  1
2    6  1

Name is :b
    B  C
3   7  1
4   5  1
5   6  1
6   6  1

Name is :c
      B  C
7    7  1
8    7  1

Name is :d
       B  C
9      6  1
10    7  1
11    7  1

你在哪里得到你正在处理的名字,然后是dfsub只包含你正在查看的数据的数据框。


推荐阅读