Python 将列名移动到框架中的第一行
我忘记了如何将dataframe中的所有列移动到dataframe的第一列。 ->我希望添加另一个函数,它还可以计算有多少列,然后为新列名指定名称 例如: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], '
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)