我在不同的情況下發布了這個問題,現在我想知道如何使用一個回圈來完成這個問題。對于我有100列的大型資料框架,手動連接變得很困難。
我有這樣一個Pandas資料框架:
我有這樣一個Pandas資料框架。
data4 = {'g_pairs' : ['an_jk', 'tf_ha', 'ab_rh', 'et_x2','yr_po'] 。
'g_a': ['en762','en72b','en925','en980','en009'] 。
'g_b': ['en361','en231','en666','en771','en909'] 。
'epi|ap':[0.020,1, 0. 05,0.7,0.001】。]
'ap|epi':[1,1, 0. 1,0.0001,1】。]
'fib|mac': [0.001,0. 002,0.0021,0.3,0.005】。]
'mac|fib': [0.0002,0. 0043,0.0067,0.0123,0.0110]}。
df4 = pd.DataFrame(data4)
g_pairs g_a g_b epi|ap ap|epi fib|mac mac|fib
0 an_jk en762 en361 0.020 1.0000 0.0010 0.0002
1 tf_ha en72b en231 1.000 1.0000 0.0020 0.0043
2 ab_rh en925 en666 0.050 0.1000 0.0021 0.0067
3 et_x2 en980 en771 0.700 0.0001 0.3000 0.0123 >。
4 yr_po en009 en909 0.001 1.0000 0.0050 0.0110
我想通過重新定位列名的對立面來重組該表。例如,an_jk在ap|epi下有一個1的值,但是如果我把名字翻成jk_an,我就可以在epi|ap列下添加這個新專案,并去掉ap|epi列。
實質上,我想定義一個包含所有名字的串列,并讓回圈遍歷這個串列以生成這個表。
list = ['ap'/span>, 'epi','fib','mac']
for i in range(0, len(list))。)
for j in range(i, len(list)>:)
col = list[i] '|'/span> list[j]
col2 = list[j] '|' list
有點類似這樣的效果。
輸出應該是這樣的:
g_pairs g_a g_b epi|ap fib|mac
0 an_jk en762 en361 0.0200 0.0010
1 jk_an en762 en3611.0000 0.0002
2 tf_ha en72b en2311.0000 0.0020
3 ha_tf en72b en231 1.0000 0.0043
4 ab_rh en925 en666 0.0500 0.0021
5 rh_ab en925 en6660.1000 0.0067
6 et_x2 en980 en771 0.7000 0.3000
7 x2_et en980 en771 0.0001[/span> 0.0123[/span
8 yr_po en009 en909 0.0010[/span> 0.0050[/span
9 po_yr en009 en909 1.0000 0.0110
uj5u.com熱心網友回復:
其中一個解決方案是不用for回圈來創建df,我只用for回圈來改變列名,這將是非常快的。
df.columns = ['|'/span>.join(sorted(x.split('|'/span>)) if '|' in x else x for xin df. 列]。
df = df.set_index(['g_pairs','g_a','g_b'] )
df.columns = pd.MultiIndex.from_arrays([df.columns,df.groupby(level=0, axis=1).cumcount()])
out = df.stack().reset_index()
g_pairs g_a g_b level_3 ap|epi fib|mac
0 an_jk en762 en361 0 0.0200 0.0010
1 an_jk en762 en361 1 1.0000 0.0002
2 tf_ha en72b en231 0 1.0000 0.0020
3 tf_ha en72b en231 1 1.0000 0.0043
4 ab_rh en925 en666 0 0.0500 0.0021
5 ab_rh en925 en666 1 0.1000 0.0067
6 et_x2 en980 en771 0 0.7000 0.3000
7 et_x2 en980 en771 1 0.0001 0.0123
8 yr_po en009 en909 0 0.0010 0.0050
9 yr_po en009 en909 1 1.0000 0.0110
uj5u.com熱心網友回復:
你可以使用pivot_longer從pyjanitor來重塑資料;如果你的列是有序的,并且你知道新列的名字,那么這個方法效果最好:
# pip install pyjanitor。
import pandas as pd
import janitor as jn
outcome = df4.pivot_longer(index = slice('g_pairs', 'g_b'), # or index = 'g*', /span>
names_to=['epi|ap'/span>, 'fib|mac'/span>]。
names_pattern=['ap', 'fib']。
sort_by_appearance=True)
print( outcome)
g_pairs g_a g_b epi|ap fib|mac
0 an_jk en762 en361 0.0200 0.0010
1 an_jk en762 en3611.0000 0.0002
2 tf_ha en72b en2311.0000 0.0020
3 tf_ha en72b en231 1.0000 0.0043[/span]。
4 ab_rh en925 en666 0.0500 0.0021
5 ab_rh en925 en666 0.1000 0.0067
6 et_x2 en980 en771 0.7000 0.3000
7 et_x2 en980 en771 0.0001 0.0123[/span]。
8 yr_po en009 en909 0.0010[/span> 0.0050[/span
9 yr_po en009 en909 1.0000 0.0110
你可以避免pivot_longer并建立起重塑程序(采用@BENY的解決方案的想法):
outcome = df4.set_index(['g_pairs'/span>, 'g_a'/span>, 'g_b'/span>] )
# 這導致了重復的列。
cols = outcome.columns.str.split('|', expand = True)。 map(sorted).map(tuple)
# 該計數器允許我們創建唯一的列,。
# 通過MultiIndex。
counter = pd.Series(cols.get_level_values(0)).groupby(cols). cumcount()
outcome.columns = pd.MultiIndex.from_arrays([cols.map("|"/span>.join), counter])
( outcome.stack(level = -1)
.droplevel(-1)
.reset_index()
.rename(columns={"ap|epi":"epi|ap"})
)
g_pairs g_a g_b ep|api fib|mac
0 an_jk en762 en361 0.0200 0.0010
1 an_jk en762 en3611.0000 0.0002
2 tf_ha en72b en2311.0000 0.0020
3 tf_ha en72b en231 1.0000 0.0043[/span]。
4 ab_rh en925 en666 0.0500 0.0021
5 ab_rh en925 en666 0.1000 0.0067
6 et_x2 en980 en771 0.7000 0.3000
7 et_x2 en980 en771 0.0001 0.0123[/span]。
8 yr_po en009 en909 0.0010[/span> 0.0050[/span
9 yr_po en009 en909 1.0000 0.0110
只要索引是唯一的,這就可以了;pivot_longer涵蓋了索引可能不唯一的情況。
為了進一步翻轉g_pairs中的值,我們可以在groupby之后利用str.replace與cumcount:
首先,groupby得到累積計數:
outcome['count'] = outcome.groupby('g_pairs').cumcount()
print( outcome)
g_pairs g_a g_b epi|ap fib|mac counter
0 an_jk en762 en361 0.0200 0.0010 0
1 an_jk en762 en361 1.0000 0.0002 1
2 tf_ha en72b en231 1.0000 0.0020 0
3 tf_ha en72b en231 1.0000 0.0043 1
4 ab_rh en925 en666 0.0500 0.0021 0
5 ab_rh en925 en666 0.1000 0.0067 1
6 et_x2 en980 en771 0.7000 0.3000 0
7 et_x2 en980 en771 0.0001 0.0123 1
8 yr_po en009 en909 0.0010 0.0050 0
9 yr_po en009 en909 1.0000 0.0110 1
接下來,如果計數器等于1,使用pd.str.replace來翻轉文本:
pat = r"(?P<first> . )_(?P<last> . )"/span>
repl = lambda m: f"{m.group('last'/span>)}_{m.group('first'/span>)}"
outcome['g_pairs'] = outcome.g_pairs.where( outcome.counter.eq(0),
結果.g_pairs
.str.replace(Pat,
復制。
regex = True)
)
outcome.drop(columns='counter')
g_pairs g_a g_b epi|ap fib|mac
0 an_jk en762 en361 0.0200 0.0010
1 jk_an en762 en3611.0000 0.0002
2 tf_ha en72b en2311.0000 0.0020
3 ha_tf en72b en231 1.0000 0.0043
4 ab_rh en925 en666 0.0500 0.0021
5 rh_ab en925 en6660.1000 0.0067
6 et_x2 en980 en771 0.7000 0.3000
7 x2_et en980 en771 0.0001[/span> 0.0123[/span
8 yr_po en009 en909 0.0010[/span> 0.0050[/span
9 po_yr en009 en909 1.0000 0.0110
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327367.html
標籤:
下一篇:Eclipse-除錯
