如何在 pandas 中获取每第 n 列?

22

我有一个数据框长这样:

    a1    b1    c1    a2    b2    c2    a3    ...
x   1.2   1.3   1.2   ...   ...   ...   ...
y   1.4   1.2   ...   ...   ...   ...   ...
z   ...

我想要的是按每第n列分组。换句话说,我想要一个包含所有a的数据框,一个包含所有b的数据框,以及一个包含所有c的数据框。

    a1     a2     a4
x   1.2    ...    ...
y
z
在另一个SO问题中,我看到可以使用df.iloc[::5,:]来获取每5行。当然,我也可以使用df.iloc[:,::3]来获取c列,但无法获取a和b列。 有什么想法吗?
3个回答

34

切割列:

df[df.columns[::2]]

获取每个第n列

例子:

In [2]:
cols = ['a1','b1','c1','a2','b2','c2','a3']
df = pd.DataFrame(columns=cols)
df

Out[2]:
Empty DataFrame
Columns: [a1, b1, c1, a2, b2, c2, a3]
Index: []

In [3]:
df[df.columns[::3]]
Out[3]:

Empty DataFrame
Columns: [a1, a2, a3]
Index: []

您还可以使用startswith进行过滤:

In [5]:
a = df.columns[df.columns.str.startswith('a')]
df[a]

Out[5]:
Empty DataFrame
Columns: [a1, a2, a3]
Index: []

并对b列、c列等执行相同操作。

您可以使用以下方法获取所有唯一列前缀的集合:

In [19]:
df.columns.str.extract(r'([a-zA-Z])').unique()

Out[19]:
array(['a', 'b', 'c'], dtype=object)

您可以使用这些值来使用 startswith 过滤列


但是我有n个a、b、c的数字。这只能让我得到c1、c2、c3...cn。 - Angelo
@BowenLiu 最简单的方法是先创建一个包含前10列的列表,然后将其与感兴趣的其余列的列表连接起来,并将其传递给你的数据框以进行子选择。我认为没有更好的方法来完成这个任务。 - EdChum
谢谢Ed。我有一个与这篇文章无关的问题。但是我看到你在Pandas方面非常博学,所以我还是要问一下:是否有办法添加一个总行,仅计算我指定的列,类似于df.loc['Total'] = df.sum(select_list), select_list = [columnA, columnB ...]。我发了一篇帖子,但并没有得到我想要的答案。再次感谢。 - Bowen Liu
@BowenLiu https://dev59.com/OF8e5IYBdhLWcg3wcKAq#25748826 - EdChum
我在谷歌上搜索了一会儿,但没有找到。谢谢! - Bowen Liu
显示剩余4条评论

6

在当前版本(0.24)中,以下操作可以正常工作:

获取您的“a”列:

df.iloc[:, ::3]

获取你的'b'列:
df.iloc[:, 1::3]

获取'C'列:

df.iloc[:, 2::3]

4
以下内容应该可以正常工作:
df.ix[:, ::2] - get every second column, beginning with first (here all a's)
df.ix[:, 1::2] - get every second column, beginning with second (b's)
....

我刚刚搜索了同样的问题并找到了解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接