Pandas 我有一个由groupby生成的df列表,我需要添加一个新的列,列的频率为kmer

Pandas 我有一个由groupby生成的df列表,我需要添加一个新的列,列的频率为kmer,pandas,pandas-groupby,Pandas,Pandas Groupby,我有一个使用groupby函数得到的pandas数据帧列表,我想在其中添加一个新列,其中包含每个kmer的频率。我通过一个循环实现了这一点,但收到一条消息警告我需要使用df.loc[索引,col_名称]。 这里是指向csv文件的一个示例的链接: 循环可以工作,但我希望有一个干净高效的代码来应用 dfs列表如下所示: kmers counts length 0 A 567623 1 1 C 350724 1 2 G 347436

我有一个使用groupby函数得到的pandas数据帧列表,我想在其中添加一个新列,其中包含每个kmer的频率。我通过一个循环实现了这一点,但收到一条消息警告我需要使用df.loc[索引,col_名称]。 这里是指向csv文件的一个示例的链接:

循环可以工作,但我希望有一个干净高效的代码来应用

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
df=pd.read\u csv(文件)
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)]
对于dfs中的df:
df['frequency']=df['counts']/df['counts'].sum()
:2:设置为带有CopyWarning:
试图在数据帧切片的副本上设置值。
尝试改用.loc[row\u indexer,col\u indexer]=value
请参阅文档中的注意事项:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view vs-a-copy

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

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

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

范围内i的
(len(dfs)):
dfs[i]['frequency']=dfs[i]。计数/dfs[i]。计数。总和()
#[kmers计数长度频率
#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计数长度频率
#4 TA 263910 2 0.072110
#11 AT 333672 0.091172
#18 TG 241614 2 0.066018
#25 GG 134462 2 0.036740
# ...

我解决了这个问题,只是在我的理解列表中添加了.copy(),如下所示:

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

它解决了警告

谢谢大家

复活节快乐

救命


Paulo

我的代码类似于tdy代码。我用len做了一个groupby,然后在一个列表压缩中,我将DFs列表分组,然后做了一个类似于tdy的循环。因为它是一个大的csv,所以我尝试使用.loc(索引,“计数”).tranform(“频率”)。但效果不好。谢谢。这没有帮助。我们需要实际代码,包括a形式的示例数据。请阅读并在问题中添加a。
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()