【发布时间】: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 和索引,但我还不够聪明,无法完成它!
【问题讨论】:
-
请阅读How to Ask并在您的问题中添加minimal reproducible example。
标签: pandas pandas-groupby