【问题标题】:How to replace/assign a block of data in a Pandas dataframe如何替换/分配 Pandas 数据框中的数据块
【发布时间】:2020-05-01 08:28:41
【问题描述】:

我有一个名为 test3 的数据集,看起来像(从 excel 导入):

$ID  $spec    $orient $direct   $rep     $slope   $intercept
9119    1       stance  15b     1       2859.09223  158
9119    2       stance  15b     2       2886.53583  321
9119    3       stance  0       1       2860.91423  21
9119    4       fall    15f     1       2878.9364   326
9119    5       fall    15f     2       2902.0397   45
9120    1       stance  15b     1       1444.91347  654
9120    2       stance  15b     2       1460.09585  23
9120    3       stance  0       1       1470.2588   85
9120    4       fall    15f     1       1481.6892   225
9120    5       fall    15f     2       1475.40215  145

还有一个名为test3mean的模板数据框:

$ID  $spec    $orient $direct   $slope   $intercept
9119    1       stance  15b     nan     nan
9119    2       stance  0       nan     nan
9119    3       fall    15f     nan     nan
9120    1       stance  15b     nan     nan
9120    2       stance  0       nan     nan
9120    3       fall    15f     nan     nan

我正在使用 Pandas 数据框计算 $slope$intercepttest3 中重复测量的平均值,并将它们放在 test3mean 中的相应列中:

ID = np.array([9119,9120])
orient = np.array(['stance','fall'])
direct = np.array(['0','15f','15b'])

for i in ID:
    for o in orient:
        for d in direct:
            test3mean[test3mean['$ID']==i][test3mean['$orient']==o][test3mean['$direct']==d][['$slope','$intercept']] = test3[test3['$ID']==i][test3['$orient']==o][test3['$direct']==d][test3['$rep']!=3].mean()[['$slope','$intercept']]

但是,test3mean 不会改变。我知道复制与查看问题,并且已经看到df.loc[:,()] 解决方案,但无法针对我的具体情况实施它们。

两步循环后的预期输出将是 test3mean 的样子:

$ID  $spec    $orient $direct   $slope       $intercept
9119    1       stance  15b     2872.81403  239.5
9119    2       stance  0       2860.91423  21
9119    3       fall    15f     nan     nan
9120    1       stance  15b     nan     nan
9120    2       stance  0       nan     nan
9120    3       fall    15f     nan     nan

【问题讨论】:

  • 你能提供预期的输出吗
  • 我认为您需要重新考虑并使用groupbymerge 以获得所需的结果。由于复制与视图问题,您正在使用索引链接,这在熊猫中是一个很大的“不可以”。
  • @Kenan:我在问题中添加了一个示例输出。
  • @Scott:我知道我不应该使用索引链接,但我无法将我找到的解决方案应用于我的案例,它有三个 getitem 命令和两列(每次更换一块1X2)。你能提供一个具体的建议吗?

标签: python pandas dataframe data-science


【解决方案1】:

使用DataFrame.groupby:

result = (test3[test3['$rep'].ne(3)].groupby(['$ID','$orient','$direct'],as_index=False)['$slope','$intercept']
                                    .mean())

#    $ID $orient $direct       $slope  $intercept
#0  9119    fall     15f  2890.488050       185.5
#1  9119  stance       0  2860.914230        21.0
#2  9119  stance     15b  2872.814030       239.5
#3  9120    fall     15f  1478.545675       185.0
#4  9120  stance       0  1470.258800        85.0
#5  9120  stance     15b  1452.504660       338.5

如果您需要与test3mean 合并,请使用DataFrame.mergehow ='left'

(test3mean.drop(['$slope','$intercept'],axis=1)
          .merge(result,on=['$ID','$orient','$direct'],how='left'))

输出

    $ID  $spec $orient $direct       $slope  $intercept
0  9119      1  stance     15b  2872.814030       239.5
1  9119      2  stance       0  2860.914230        21.0
2  9119      3    fall     15f  2890.488050       185.5
3  9120      1  stance     15b  1452.504660       338.5
4  9120      2  stance       0  1470.258800        85.0
5  9120      3    fall     15f  1478.545675       185.0

【讨论】:

  • 感谢您的快速解决方案!
  • 剩下的一点是我的 [test3['$rep']!=3] 条件,该条件未包含在此解决方案中。
  • ups,现在检查。我很乐意提供帮助:)
【解决方案2】:

看看这个:

df.groupby(['$ID','$orient','$direct'], as_index=False)[['$slope','$intercept']].mean()

输出:

    $ID $orient $direct       $slope  $intercept
0  9119    fall     15f  2890.488050       185.5
1  9119  stance       0  2860.914230        21.0
2  9119  stance     15b  2872.814030       239.5
3  9120    fall     15f  1478.545675       185.0
4  9120  stance       0  1470.258800        85.0
5  9120  stance     15b  1452.504660       338.5

【讨论】:

  • @ansev 解决方案将其完成。 :)
  • 谢谢你们!
  • 剩下的一点是我的 [test3['$rep']!=3] 条件,该条件未包含在此解决方案中。虽然我在这里展示的数据中不是这种情况,但它是我实际数据集中的一个重要条件。
猜你喜欢
  • 2022-01-26
  • 2021-07-22
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2015-03-01
相关资源
最近更新 更多