遍历groupby并添加新列

克莱门斯

我需要编写一个小脚本来获取一些数据(每个文件约5万行),而我的原始文件如下所示:

    Label   ID  TRACK_ID    QUALITY POSITION_X  POSITION_Y  POSITION_Z  POSITION_T  FRAME   RADIUS  VISIBILITY  MANUAL_COLOR    MEAN_INTENSITY  MEDIAN_INTENSITY    MIN_INTENSITY   MAX_INTENSITY   TOTAL_INTENSITY STANDARD_DEVIATION  ESTIMATED_DIAMETER  CONTRAST    SNR
    ID1119  1119    9       6.672     384.195     122.923   0   0   0   5   1   -10921639   81.495  0   0   255 7905    119.529 5.201   1   0.682
    ID2237  2237    9       7.078     381.019     122.019   0   1   1   5   1   -10921639   89.381  0   0   255 8670    122.301 5.357   1   0.731
    ID2512  2512    9       7.193     377.739     120.125   0   2   2   5   1   -10921639   92.01   0   0   255 8925    123.097 5.356   1   0.747
    (...)
    ID1102  1102    18      4.991     808.857     59.966    0   0   0   5   1   -10921639   52.577  0   0   255 5100    103.7   4.798   1   0.507
    (...)

它是一个相当大的表,最多可容纳5万行。现在,并不是所有数据对我都很重要,我主要需要Track_ID以及X和Y位置。所以我使用excel文件创建一个数据框,只访问相应的列

IN   df = pd.read_excel('.../sample.xlsx', 'Sheet1',parse_cols="D, F,G")

并且这按预期工作。每个track_id基本上是一组需要分析的数据。因此,直接的方法是按track_id对数据帧进行分组

IN Grouping = df.groupby("TRACK_ID")

也可以按预期工作。现在,我需要获取每个组的第一个POSITION_X值,然后从该组中的其他POSITION_X值中减去它们。现在,我已经读过循环可能不是解决问题的最佳方法,但是我不知道该怎么做。

for name, group in Grouping:
    first_X = group.iloc[0, 1]
    vect = group.iloc[1:,1] - first_X    

这会将值存储在vect中,如果我将其打印出来,它将为我提供正确的值。但是,我有一个问题,就是我现在不知道如何将其添加到新列中。也许有人可以引导我朝正确的方向发展。提前致谢。

编辑这是由chappers建议

def f(grouped):
    grouped.iloc[1:] = 0
    return grouped

grouped = df.groupby('TRACK_ID')
df['Calc'] = grouped['POSITION_X'].apply(lambda x: x - x.iloc[0]) grouped['POSITION_X'].apply(f)
for name, group in grouped:
    print name
    print group

Input:    
     TRACK_ID  POSITION_X  POSITION_Y
0          9     384.195     122.923
1          9     381.019     122.019
2          9     377.739     120.125
3          9     375.211     117.224
4          9     373.213     113.938
5          9     371.625     110.161
6          9     369.803     106.424
7          9     367.717     103.239
8         18     808.857      59.966
9         18     807.715      61.032
10        18     808.165      63.133
11        18     810.147      64.853
12        18     812.084      65.084
13        18     812.880      63.683
14        18     812.083      62.203
15        18     810.041      61.188
16        18     808.568      62.260

Output for group == 9
   TRACK_ID  POSITION_X  POSITION_Y     Calc
0         9     384.195     122.923  384.195
1         9     381.019     122.019   -3.176
2         9     377.739     120.125   -6.456
3         9     375.211     117.224   -8.984
4         9     373.213     113.938  -10.982
5         9     371.625     110.161  -12.570
6         9     369.803     106.424  -14.392
7         9     367.717     103.239  -16.478

因此,预期的输出将是每个组的第一个计算值是0

ch

这是一种处理方法,使用apply方法从所有其他对象中减去第一项。

df = DataFrame({'A' : ['foo', 'foo', 'foo', 'foo',
                           'bar', 'bar', 'bar', 'bar'],
                    'C' : [1,2,3,4,4,3,2,1]})

grouped = df.groupby('A')
df['C1'] = grouped['C'].apply(lambda x: x - x.iloc[0]) 

这将有输入:

     A  C
0  foo  1
1  foo  2
2  foo  3
3  foo  4
4  bar  4
5  bar  3
6  bar  2
7  bar  1

和输出

     A  C  C1
0  foo  1   0
1  foo  2   1
2  foo  3   2
3  foo  4   3
4  bar  4   0
5  bar  3  -1
6  bar  2  -2
7  bar  1  -3

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫groupby并添加新列

遍历if语句的行并添加到新列[Pandas / Python]

使用GroupBy向数据框添加新列

如何在pandas groupby中添加新列?

将GroupBy平均结果添加为熊猫中的新列

遍历链表并添加新值

循环遍历并将列表添加到新行或新列中的数据框

循环遍历特定的列数据,并将结果添加为R中的新列

在pyspark数据框中遍历两列的同时向新列添加值

遍历数据框中的行创建一个新列,然后基于该新列添加更多列

添加一个具有基于 groupby 值的值的新列另外两列

使用熊猫组合工作表,遍历特定列,将行添加到新列表

如何遍历数据框,创建新列并在python中为其添加值

遍历数据框以添加具有顺序值的新列

根据 groupby 值向 Pandas 数据框添加一个新列

为groupby中的每个组将value_counts()的索引添加到新列

熊猫中的新列-通过应用列表groupby将系列添加到数据框

熊猫:将具有多个值的新列添加到groupby数据框

Pandas GroupBy并将唯一值计数添加为新列

添加新列后,我尝试在数据框上使用groupBy,但遇到任务TaskNotSerializable问题

Pandas:将汇总信息添加到 groupby 框架中的新列

遍历pandas列并创建新列

在创建新的列Matlab时遍历列

每次参考列的值更改时,都添加一个带有循环遍历向量的值的新列

SQL添加新列

添加新列天

添加动态新列

创建一个函数以遍历现有数据框并将值添加到新列

遍历数据帧以产生新列