python - 使用变量在循环中从 DataFrame 中提取数据

标签 python pandas dataframe

我有一个数据框,我试图将 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”

有办法解决这个问题吗?

这是我正在尝试组织的数据集: “波长”单元格位于 B29。

最佳答案

您需要ilocget_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/

相关文章:

python - 我可以在不成为系统管理员的情况下修复 "version GLIBC_2.14 not found"错误吗?

python - 在CentOS上清除并重新安装python

python - Cython:内联函数不是纯 C

python - 如何将列转换为数字,同时在 pandas 中保持失败的列完好无损

python - 使用另一列作为索引的 Pandas 子字符串

python - 在可变长度数据帧上使用 .sub() ?

python - 删除行值类似于 '[ ]' 的数据框列

R - 在数据框中使用 NA 进行计数

python - Pandas - 保持至少有两个不同代码的组

python - 无法创建 Blob 容器 : This request is not authorized to perform this operation