【问题标题】:I have a list of df resulting by groupby and I need to add a new column with the frequency of kmers我有一个由 groupby 生成的 df 列表,我需要添加一个具有 kmers 频率的新列
【发布时间】:2021-06-30 07:54:51
【问题描述】:

我有一个应用 groupby 函数的 pandas 数据帧列表,我想向它们添加一个新列,其中包含每个 kmer 的频率。我使用循环执行此操作,但收到一条消息警告我需要使用 df.loc[index, col_names]。 这是一个指向 csv 文件示例的链接: https://drive.google.com/file/d/17vYbIEza7l-1mFnavGGO1QjCjPdhxG7C/view?usp=sharing

"A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead"

循环有效,但我希望应用干净高效的代码。

dfs的列表是这样的:

  kmers  counts  length
0     A  567623       1
1     C  350724       1
2     G  347436       1
3     T  564242       1
    kmers  counts  length
4      TA  263910       2
11     AT  333672       2
18     TG  241614       2
25     GG  134462       2
32     GC  191060       2
39     CA  241614       2
46     AA  437390       2
59     TT  437390       2
109    GT  183723       2
127    TC  188869       2
197    CG  145046       2
238    CC  134462       2
318    AG  177008       2
336    AC  183723       2
388    GA  188869       2
537    CT  177008       2
     kmers  counts  length
5      TAT   76688       3
12     ATG   60467       3
19     TGG   54513       3
26     GGC   37323       3
33     GCA   64928       3
40     CAA   93670       3
47     AAT  131279       3
53     ATT  131279       3
60     TTA  102674       3
66     TAA  102674       3
72     AAA  164986       3
92     TTG   93670       3
103    GGT   42668       3
110    GTA   46316       3
121    ATC   65235       3
128    TCA   68008       3
156    GTT   68473       3
162    TTT  164986       3
185    GTC   22371       3
191    TCG   37613       3
198    CGT   41831       3
221    CGG   25370       3
232    GCC   37323       3
239    CCG   25370       3
274    TTC   76014       3
280    TCC   32192       3
295    GTG   46545       3
301    TGC   64928       3
312    CAG   40915       3
319    AGC   48577       3
330    CAC   46545       3
337    ACA   54158       3
348    AAC   68473       3
364    ACC   42668       3
382    TGA   68008       3
389    GAT   65235       3
405    GAC   22371       3
416    CAT   60467       3
436    GAA   76014       3
442    AAG   72628       3
448    AGT   45057       3
464    TGT   54158       3
475    TAG   38228       3
481    AGG   32306       3
514    ACG   41831       3
520    CGA   37613       3
531    ACT   45057       3
538    CTT   72628       3
607    ATA   76688       3
613    TAC   46316       3
640    GCT   48577       3
748    CTC   25228       3
836    CTG   40915       3
881    AGA   51053       3
992    CTA   38228       3
1096   CCA   54513       3
1155   GGG   22265       3
1241   CGC   40224       3
1272   GCG   40224       3
1322   TCT   51053       3
1534   CCC   22265       3
1615   CCT   32306       3
2171   GGA   32192       3
3599   GAG   25228       3

我想这样做,而不会对列表中的每个分组 df 发出奇怪的警告:

    [  kmers  counts  length  frequency
 0     A  567623       1   0.310172
 1     C  350724       1   0.191650
 2     G  347436       1   0.189853
 3     T  564242       1   0.308325,
     kmers  counts  length  frequency
 4      TA  263910       2   0.072110
 11     AT  333672       2   0.091172
 18     TG  241614       2   0.066018
 25     GG  134462       2   0.036740
 32     GC  191060       2   0.052205
 39     CA  241614       2   0.066018
 46     AA  437390       2   0.119511
 59     TT  437390       2   0.119511
 109    GT  183723       2   0.050200
 127    TC  188869       2   0.051606
 197    CG  145046       2   0.039632
 238    CC  134462       2   0.036740
 318    AG  177008       2   0.048365
 336    AC  183723       2   0.050200
 388    GA  188869       2   0.051606
 537    CT  177008       2   0.048365,
      kmers  counts  length  frequency
 5      TAT   76688       3   0.020955
 12     ATG   60467       3   0.016523
 19     TGG   54513       3   0.014896
 26     GGC   37323       3   0.010199
 33     GCA   64928       3   0.017742
 40     CAA   93670       3   0.025596
 47     AAT  131279       3   0.035872
 53     ATT  131279       3   0.035872
 60     TTA  102674       3   0.028056
 66     TAA  102674       3   0.028056
 72     AAA  164986       3   0.045083
 92     TTG   93670       3   0.025596
 103    GGT   42668       3   0.011659
 110    GTA   46316       3   0.012656
 121    ATC   65235       3   0.017826
 128    TCA   68008       3   0.018583
 156    GTT   68473       3   0.018710
 162    TTT  164986       3   0.045083
 185    GTC   22371       3   0.006113
 191    TCG   37613       3   0.010278
 198    CGT   41831       3   0.011430
 221    CGG   25370       3   0.006932
 232    GCC   37323       3   0.010199
 239    CCG   25370       3   0.006932
 274    TTC   76014       3   0.020771
 280    TCC   32192       3   0.008797
 295    GTG   46545       3   0.012719
 301    TGC   64928       3   0.017742
 312    CAG   40915       3   0.011180
 319    AGC   48577       3   0.013274
 330    CAC   46545       3   0.012719
 337    ACA   54158       3   0.014799
 348    AAC   68473       3   0.018710
 364    ACC   42668       3   0.011659
 382    TGA   68008       3   0.018583
 389    GAT   65235       3   0.017826
 405    GAC   22371       3   0.006113
 416    CAT   60467       3   0.016523
 436    GAA   76014       3   0.020771
 442    AAG   72628       3   0.019846
 448    AGT   45057       3   0.012312
 464    TGT   54158       3   0.014799
 475    TAG   38228       3   0.010446
 481    AGG   32306       3   0.008828
 514    ACG   41831       3   0.011430
 520    CGA   37613       3   0.010278
 531    ACT   45057       3   0.012312
 538    CTT   72628       3   0.019846
 607    ATA   76688       3   0.020955
 613    TAC   46316       3   0.012656
 640    GCT   48577       3   0.013274
 748    CTC   25228       3   0.006894
 836    CTG   40915       3   0.011180
 881    AGA   51053       3   0.013950
 992    CTA   38228       3   0.010446
 1096   CCA   54513       3   0.014896
 1155   GGG   22265       3   0.006084
 1241   CGC   40224       3   0.010991
 1272   GCG   40224       3   0.010991
 1322   TCT   51053       3   0.013950
 1534   CCC   22265       3   0.006084
 1615   CCT   32306       3   0.008828
 2171   GGA   32192       3   0.008797
 3599   GAG   25228       3   0.006894]

任何帮助将不胜感激!

保罗

我的代码:

df = pd.read_csv(file)
df['length'] = df['kmers'].str.len()
df_by_length = df.groupby(['length'])
dfs = [df_by_length.get_group(i) for i in range(1, 9)]
for df in dfs:
    df['frequency'] = df['counts'] / df['counts'].sum()

<ipython-input-142-fd9cfa03968f>:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

希望这有助于理解!我得到了新表,但我想使用正确的代码来避免该警告!我尝试使用 loc 和索引,但我还不够聪明,无法完成它!

【问题讨论】:

标签: pandas pandas-groupby


【解决方案1】:

这是一个与 SettingWithCopyWarning 相关的错误。这很重要——阅读它here。通常您可以使用.loc 和避免重复切片来避免它,但在某些必须重复切片的情况下,您可以通过将.copy() 结束到表达式的末尾来绕过它。您可以通过链接了解何时以及为什么这很重要。要更准确地了解您的代码是如何产生的,您需要向我们展示您的代码的MRCE

【讨论】:

  • 我的代码和tdy代码类似。通过 len 做了一个 groupby,然后在一个列表中,我得到了 DF 的分组列表,然后做了一个类似于 tdy 的循环。因为它是一个很大的 csv,所以我尝试使用 .loc(index, "count").transform("frequency")。但效果并不好。谢谢
  • 这没有帮助。我们需要包含minimal reproducible example 形式的示例数据的实际代码。
【解决方案2】:

如果您的数据框列表名为dfs,您可以创建每个frequency 列,将dfs[i].counts 除以dfs[i].counts.sum()

for i in range(len(dfs)):
    dfs[i]['frequency'] = dfs[i].counts / dfs[i].counts.sum()

# [  kmers  counts  length  frequency
#  0     A  567623       1   0.310172
#  1     C  350724       1   0.191650
#  2     G  347436       1   0.189853
#  3     T  564242       1   0.308325,
#      kmers  counts  length  frequency
#  4      TA  263910       2   0.072110
#  11     AT  333672       2   0.091172
#  18     TG  241614       2   0.066018
#  25     GG  134462       2   0.036740
# ...

【讨论】:

    【解决方案3】:

    我通过在我的理解列表中添加 .copy() 来解决问题,如下所示:

    dfs = [df_by_length.get_group(i).copy() for i in range(1, 9)]
    

    然后:

    for df in dfs:
        df['frequency'] = df['counts'] / df['counts'].sum()
    

    它解决了警告!

    谢谢大家!

    复活节快乐!

    救命!

    保罗

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多