我忘记了如何在PANDAS WAY中将数据框中的所有列移动到数据框中的第一列。 ->我希望添加另一个函数,该函数还可以计算出多少列,然后为新列名称分配名称。
示例:
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
如果可能的话,我希望了解更多处理框架的熊猫方法,因此请尽可能多地使用熊猫方法。谢谢。
答案 0 :(得分:3)
一行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)
输出
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
答案 1 :(得分:2)
这是一个版本:
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
答案 2 :(得分:1)
尝试:
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
答案 3 :(得分:1)
您可以使用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([[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)
使用形状为(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)
答案 4 :(得分:0)
您可以这样做:
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