我在互聯網上搜索了我的問題的解決方案,但我找不到。我有以下資料框
pos1 pos2 pos3
0 A A A
1 B B B
2 C C C
3 D D D
4 E E E
5 F F F
6 G G G
7 H H H
8 I I I
我想將以下資料幀添加到現有資料幀中:
pos1 pos2 pos3
0 A B C
1 A B C
2 A B C
3 D E F
4 D E F
5 D E F
6 G H I
7 G H I
8 G H I
所以我得到以下資料框:
pos1 pos2 pos3
0 A A A
1 B B B
2 C C C
3 D D D
4 E E E
5 F F F
6 G G G
7 H H H
8 I I I
9 A B C
10 A B C
11 A B C
12 D E F
13 D E F
14 D E F
15 G H I
16 G H I
17 G H I
我知道行數總是列數的倍數。這意味著如果我有 4 列,那么行應該是 4、8、12、16 等。我的例子是列是 3,行是 9
然后我想要做的是將行轉換為列,但僅限于該列數。所以我希望前 3 行與列一起轉置,然后是接下來的 3 行,依此類推。
我現在有以下代碼:
import pandas as pd
import io
s = """pos1 pos2 pos3
A A A
B B B
C C C
D D D
E E E
F F F
G G G
H H H
I I I
"""
df = pd.read_csv(io.StringIO(s), delim_whitespace=True)
final_df = df.copy()
index_values = final_df.index.values
value = 0
while value < len(df.index):
sub_df = df[value:value 3]
sub_df.columns = index_values[value: value 3]
sub_df = sub_df.T
sub_df.columns = df.columns
final_df = pd.concat([final_df, sub_df])
value = len(df.columns)
final_df = final_df.reset_index(drop=True)
print(final_df)
由于forloop,我現在擁有的代碼很慢。是否可以在不使用 forloop 的情況下獲得相同的解決方案?
uj5u.com熱心網友回復:
您可以使用下面的numpy的陣列ravel,并reshape與order='F'引數(列主順序)和pandas.DataFrame構造。
然后concat輸出與原始陣列:
pd.concat([df,
pd.DataFrame(df.to_numpy().ravel().reshape(df.shape, order='F'),
columns=df.columns)
], ignore_index=True)
輸出:
pos1 pos2 pos3
0 A A A
1 B B B
2 C C C
3 D D D
4 E E E
5 F F F
6 G G G
7 H H H
8 I I I
9 A D G
10 A D G
11 A D G
12 B E H
13 B E H
14 B E H
15 C F I
16 C F I
17 C F I
uj5u.com熱心網友回復:
如果您只想使用熊貓,這有點有效。
for value in range(1,int(len(df.index)/3)):
df.loc[len(df) value*value]=df.iloc[(value*3)-3:value*3,0:1].T.values[0]
df.loc[len(df) value*value 1]=df.iloc[(value*3)-3:value*3,0:1].T.values[0]
df.loc[len(df) value*value 2]=df.iloc[(value*3)-3:value*3,0:1].T.values[0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392724.html
下一篇:一個條目中更多值的累積總和
