Python 将列名移动到框架中的第一行

Python 将列名移动到框架中的第一行,python,pandas,Python,Pandas,我忘记了如何将dataframe中的所有列移动到dataframe的第一列。 ->我希望添加另一个函数,它还可以计算有多少列,然后为新列名指定名称 例如: df = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [2,3,4,5,6,7], 'c': [2,3,4,5,6,7], 'd': [2,3,4,5,6,7], '

我忘记了如何将dataframe中的所有列移动到dataframe的第一列。 ->我希望添加另一个函数,它还可以计算有多少列,然后为新列名指定名称

例如:

df = pd.DataFrame({'a': [1,2,3,4,5,6],
                  'b': [2,3,4,5,6,7],
                  'c': [2,3,4,5,6,7],
                  'd': [2,3,4,5,6,7],
                  'e': [2,3,4,5,6,7]})
电流输出:

    a   b   c   d   e
0   1   2   2   2   2
1   2   3   3   3   3
2   3   4   4   4   4
3   4   5   5   5   5
4   5   6   6   6   6
5   6   7   7   7   7
预期产出:

    Q1.1    Q1.2    Q1.3    Q1.4    Q1.5
0   a   b   c   d   e
1   1   2   2   2   2
2   2   3   3   3   3
3   3   4   4   4   4
4   4   5   5   5   5
5   5   6   6   6   6
6   6   7   7   7   7
请如果可能的话,我希望了解更多熊猫处理框架的方式,所以请尽可能多地使用熊猫方式。谢谢。

试试:

df = pd.DataFrame({'a': [1,2,3,4,5,6],
                  'b': [2,3,4,5,6,7],
                  'c': [2,3,4,5,6,7],
                  'd': [2,3,4,5,6,7],
                  'e': [2,3,4,5,6,7]})
df.loc[-1,:] = df.columns
df.index += 1
df.sort_index(inplace = True)
df.columns=['Q1.1','Q1.2','Q1.3','Q1.4','Q1.5']
结果:

  Q1.1 Q1.2 Q1.3 Q1.4 Q1.5
0    a    b    c    d    e
1    1    2    2    2    2
2    2    3    3    3    3
3    3    4    4    4    4
4    4    5    5    5    5
5    5    6    6    6    6
6    6    7    7    7    7
您可以通过以下方式完成:

data={"A":[4,3,4],"B":[5,2,7],"C":[3,5,9],"D":[6,3,0]}

df=pd.DataFrame(data)

df.loc[-1]=df.columns
df.index = df.index + 1  # shifting index
df.sort_index(inplace=True)
df.columns=["Q1.1","Q1.2","Q1.3","Q1.4"]
结果:

  Q1.1 Q1.2 Q1.3 Q1.4
0    A    B    C    D
1    4    5    3    6
2    3    2    5    3
3    4    7    9    0
这是一个版本:

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6],
                   'b': [2, 3, 4, 5, 6, 7],
                   'c': [2, 3, 4, 5, 6, 7],
                   'd': [2, 3, 4, 5, 6, 7],
                   'e': [2, 3, 4, 5, 6, 7]})

df.loc[-1] = df.columns.values
df.sort_index(inplace=True)
df.reset_index(drop=True, inplace=True)

df.rename(columns=
    {"a": "Q1.1", "b": "Q1.2", "c": "Q1.3", "d": "Q1.4", "e": "Q1.5"}, 
    inplace=True)
首先添加一个新(最后)行
df.loc[-1]
,然后对索引进行排序(
df=df.sort\u index()
),使其成为行(现在索引
-1
),然后重置索引
df.reset\u index(drop=True,inplace=True)
,使其再次从
0
开始

它输出:

  Q1.1 Q1.2 Q1.3 Q1.4 Q1.5
0    a    b    c    d    e
1    1    2    2    2    2
2    2    3    3    3    3
3    3    4    4    4    4
4    4    5    5    5    5
5    5    6    6    6    6
6    6    7    7    7    7
一行+。可以使用设置列的名称

输出

  Q1.1 Q1.2 Q1.3 Q1.4 Q1.5
0    a    b    c    d    e
1    1    2    2    2    2
2    2    3    3    3    3
3    3    4    4    4    4
4    4    5    5    5    5
5    5    6    6    6    6
6    6    7    7    7    7
你可以用

你可以在这里

使用

如果列名可以以
Q1.0
等开头,则可以使用此选项

pd.DataFrame(np.vstack([df.columns, df.to_numpy()])).add_prefix('Q1.')

  Q1.0 Q1.1 Q1.2 Q1.3 Q1.4
0    a    b    c    d    e
1    1    2    2    2    2
2    2    3    3    3    3
3    3    4    4    4    4
4    4    5    5    5    5
5    5    6    6    6    6
6    6    7    7    7    7
时间结果: 给出问题的df用于基准测试

# Ansev's answer
In [98]: %%timeit
    ...: (df.T.reset_index().T.reset_index(drop=True)
    ...:             .set_axis([f'Q1.{i+1}' for i in range(df.shape[1])], axis=1))
    ...:
1.93 ms ± 157 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# My answer
In [99]: %%timeit
    ...: pd.DataFrame(np.vstack([df.columns, df.to_numpy()]),
    ...:                       columns = [f'Q1.{i+1}' for i in range(df.shape[1])])
    ...:
590 µs ± 43.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
使用形状为
(1000000,5)



哇!那太短了!美好的我喜欢这个兄弟!!!谢谢,这是我想要的,它会为每列添加1,而不是重命名自己1-100。谢谢。我认为在大数据帧上进行双转置可能会很慢。不确定是否测试过。在我的答案中添加了timeit结果;)方法与我的答案非常相似,但结果集的记录太少:4而不是7。这是一个很好的答案..所有3个np方法都做得很好,我想我会选择
vstack
@anky谢谢你…是的,我也会选择
vstack
,我觉得它更可读。
             # np.r_[[df.columns], df.to_numpy()]
pd.DataFrame(np.r_['0,2', df.columns, df.to_numpy()], 
             columns = [f'Q1.{i+1}' for i in range(df.shape[1])])

  Q1.1 Q1.2 Q1.3 Q1.4 Q1.5
0    a    b    c    d    e
1    1    2    2    2    2
2    2    3    3    3    3
3    3    4    4    4    4
4    4    5    5    5    5
5    5    6    6    6    6
6    6    7    7    7    7
np.concatenate([[df.columns], df.values],axis=0)
pd.DataFrame(np.vstack([df.columns, df.to_numpy()])).add_prefix('Q1.')

  Q1.0 Q1.1 Q1.2 Q1.3 Q1.4
0    a    b    c    d    e
1    1    2    2    2    2
2    2    3    3    3    3
3    3    4    4    4    4
4    4    5    5    5    5
5    5    6    6    6    6
6    6    7    7    7    7
# Ansev's answer
In [98]: %%timeit
    ...: (df.T.reset_index().T.reset_index(drop=True)
    ...:             .set_axis([f'Q1.{i+1}' for i in range(df.shape[1])], axis=1))
    ...:
1.93 ms ± 157 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# My answer
In [99]: %%timeit
    ...: pd.DataFrame(np.vstack([df.columns, df.to_numpy()]),
    ...:                       columns = [f'Q1.{i+1}' for i in range(df.shape[1])])
    ...:
590 µs ± 43.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
large_df = pd.DataFrame(np.random.randint(0,9,(1_000_000,5)),
                        columns = ['a', 'b', 'c', 'd', 'e'])
        a  b  c  d  e
0       3  8  0  8  5
1       7  4  0  0  7
2       5  1  2  6  1
3       8  0  5  5  6
4       0  2  3  1  8
...    .. .. .. .. ..
999995  1  7  3  8  7
999996  5  2  5  1  6
999997  7  4  4  3  5
999998  3  5  2  2  7
999999  6  7  0  8  0

[1000000 rows x 5 columns]
# My answer
In [105]: %%timeit
     ...: pd.DataFrame(np.vstack([large_df.columns, large_df.to_numpy()]),columns = [f'Q1.{i+1}' for i in range(large_d
     ...: f.shape[1])])
     ...:
     ...:
147 ms ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# Ansev's answer

In [107]: %%timeit
     ...: (large_df.T.reset_index().T.reset_index(drop=True)
     ...:             .set_axis([f'Q1.{i+1}' for i in range(large_df.shape[1])], axis=1))
     ...:
469 ms ± 3.52 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)