繁体   English   中英

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

[英]move column names to first row in pandas frame

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

例子:

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]})

当前 output:

    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

预期 output:

    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

如果可能的话,我希望了解更多 pandas 处理框架的方式,所以请尽可能多地使用 pandas 方式。

一行DataFrame.T + DataFrame.reset_index() 您可以使用DataFrame.set_axis()设置列的名称

new_df = (df.T.reset_index().T.reset_index(drop=True)
            .set_axis([f'Q1.{i+1}' for i in range(df.shape[1])], axis=1))
print(new_df)

Output

  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

这是一个版本:

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_index() )进行排序以使其成为行(现在具有索引-1 ),然后我重置索引df.reset_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

您可以使用np.vstack

# Use `df.to_numpy() instead of `df.values` mentioned in the docs.
new_df = pd.DataFrame(np.vstack([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.r_

             # 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

np.concatenate([[df.columns], df.values],axis=0)

如果列名可以以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

Timeit 结果:给出问题的 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)

以大型 dataframe 形状(1,000,000, 5)进行基准测试

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)

尝试:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM