我有一个数据框,我试图让A,B和C列在一个新的数据框中彼此相邻排列。
每个字母有15列。我试图创建一个for循环来循环遍历它们,以便A1,B1,C1彼此相邻,直到A15,B15和C15也是相邻的。
def organize_data(df):
rng = int(input('How many peptides do you have to analyze: '))
number = 1
frames = []
for i in range(rng):
if number == 16:
break
else:
Ax='A'+ str(number)
Bx='B'+ str(number)
Cx='C'+ str(number)
A = df.Ax[:41]
B = df.Bx[:41]
C = df.Cx[:41]
dfABC = pd.concat([A,B,C], axis=1)
frames.append(dfABC)
number = number+1
df1 = pd.concat(frames)
return(df1)
我一直收到这个错误: AttributeError:' DataFrame'对象没有属性' Ax'
有没有办法解决这个问题?
答案 0 :(得分:2)
如果需要选择包含自定义列名称的前41行,则iloc
需要get_loc
:
A = df.iloc[:41, df.columns.get_loc(Ax)]
编辑:
我完全更改了解决方案 - 想法是在MultiIndex
级别和数字的列中使用strings
。然后按第二个数字级别排序,最后按rng
过滤。 <{1}}功能不是必需的。
样品:
concat
np.random.seed(100)
mux = pd.MultiIndex.from_product([list('ABC'), range(1,16)])
df = pd.DataFrame(np.random.randint(10, size=(3,45)), columns=mux)
df.columns = [''.join((x[0], str(x[1]))) for x in df.columns]
print (df)
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 ... C6 C7 C8 C9 C10 C11 \
0 8 8 3 7 7 0 4 2 5 2 ... 9 3 2 5 8 1
1 0 8 2 5 1 8 1 5 4 2 ... 6 6 0 7 2 3
2 3 7 9 0 0 5 9 6 6 5 ... 9 0 9 8 6 2
C12 C13 C14 C15
0 0 7 6 2
1 5 4 2 4
2 0 5 3 2
[3 rows x 45 columns]
功能齐全:
#helper df
df1 = df.columns.to_series().str.extract('([a-zA-Z]+)(\d+)', expand=True)
#convert second column to int
df1[1] = df1[1].astype(int)
#create MultiIndex from df1
df.columns = df1.T.values.tolist()
#sort second level
df = df.sort_index(level=1, axis=1)
print (df)
A B C A B C A B C A ... C A B C A B C A B C
1 1 1 2 2 2 3 3 3 4 ... 12 13 13 13 14 14 14 15 15 15
0 8 4 7 8 0 7 3 9 0 7 ... 0 1 7 7 0 1 6 8 1 2
1 0 3 2 8 6 4 2 3 2 5 ... 5 5 7 4 0 6 2 9 6 4
2 3 2 8 7 3 5 9 8 2 0 ... 0 7 4 5 3 8 3 9 9 2
#filter by condition
rng = 4
df2 = df.loc[:, df.columns.get_level_values(1) <= rng]
#convert MultiIndex to columns
df2.columns = [''.join((x[0], str(x[1]))) for x in df2.columns]
print (df2)
A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4 C4
0 8 4 7 8 0 7 3 9 0 7 6 2
1 0 3 2 8 6 4 2 3 2 5 4 7
2 3 2 8 7 3 5 9 8 2 0 7 7