我有一个数据框,我试图将 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”
有办法解决这个问题吗?
最佳答案
您需要iloc
与 get_loc
如果需要选择具有自定义列名称的前 41 行:
A = df.iloc[:41, df.columns.get_loc(Ax)]
编辑:
我完全改变了解决方案 - 想法是在具有字符串
和数字级别的列中使用MultiIndex
。然后按第二个数字级别对其进行排序,并按 rng
对最后一个过滤器进行排序。 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
所有功能都在一起:
def organize_data(df):
rng = int(input('How many peptides do you have to analyze: '))
df1 = df.columns.to_series().str.extract('([a-zA-Z]+)(\d+)', expand=True)
df1[1] = df1[1].astype(int)
df.columns = df1.T.values.tolist()
df = df.sort_index(level=1, axis=1)
df2 = df.loc[:, df.columns.get_level_values(1) <= rng]
df2.columns = [''.join((x[0], str(x[1]))) for x in df2.columns]
return df2
a = organize_data(df)
print (a)
关于python - 使用变量在循环中从 DataFrame 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45962764/