我正在嘗試創建一個機器學習模型并在進行程序中自學。我將使用一個大型資料集,但在開始之前,我正在使用一個較小的資料集進行練習,以確保一切都按預期作業。我將需要交換資料集中兩列的一半行,但我不確定如何完成此操作。
假設我有一個如下所示的資料框:
| 指數 | 數字 | 信件 |
|---|---|---|
| 0 | 1 | 一種 |
| 1 | 2 | 乙 |
| 2 | 3 | C |
| 3 | 4 | D |
| 4 | 5 | 乙 |
| 5 | 6 | F |
我想隨機交換數字和字母列的一半行,所以一個輸出可能如下所示:
| 指數 | 數字 | 信件 |
|---|---|---|
| 0 | 1 | 一種 |
| 1 | 乙 | 2 |
| 2 | 3 | C |
| 3 | D | 4 |
| 4 | 5 | 乙 |
| 5 | F | 6 |
有沒有辦法在python中做到這一點?
編輯:感謝您的所有回答,非常感謝!:)
uj5u.com熱心網友回復:
這是實作這一點的一種方法。
import pandas as pd
from random import sample
df = pd.DataFrame({'index':range(6),'number':range(1,7),'letter':[*'ABCDEF']}).set_index('index')
n = len(df)
idx = sample(range(n),k=n//2) # randomly select which rows to switch
df = df.iloc[idx,:] = df.iloc[idx,::-1].values # switch those rows
一個示例結果是
number letter
index
0 1 A
1 2 B
2 C 3
3 4 D
4 E 5
5 F 6
uj5u.com熱心網友回復:
更新
要隨機選擇行,請使用np.random.choice:
import numpy as np
idx = np.random.choice(df.index, len(df) // 2, replace=False)
df.loc[idx, ['letter', 'number']] = df.loc[idx, ['number', 'letter']].to_numpy()
print(df)
# Output
number letter
0 1 A
1 2 B
2 3 C
3 D 4
4 E 5
5 F 6
舊答案
你可以試試:
df.loc[df.index % 2 == 1, ['letter', 'number']] = \
df.loc[df.index % 2 == 1, ['number', 'letter']].to_numpy()
print(df)
# Output
number letter
0 1 A
1 B 2
2 3 C
3 D 4
4 5 E
5 F 6
為了提高可讀性,請使用中間變數作為布爾掩碼:
mask = df.index % 2 == 1
df.loc[mask, ['letter', 'number']] = df.loc[mask, ['number', 'letter']].to_numpy()
uj5u.com熱心網友回復:
您可以創建原始資料的副本,對其進行采樣,然后將其更新為就地轉換為 numpy ndarray 以防止發生索引對齊。
swapped_df = df.copy()
sample = swapped_df.sample(frac=0.5, random_state=0)
swapped_df.loc[sample.index, ['number', 'letter']] = sample[['letter', 'number']].to_numpy()
print(swapped_df)
number letter
index
0 1 A
1 B 2
2 C 3
3 4 D
4 E 5
5 6 F
>>>
uj5u.com熱心網友回復:
與以前的答案類似,但如果您試圖建立對基本熊貓操作的感覺,則可讀性略高(在我看來):
rows_to_change = df.sample(frac=0.5)
rows_to_change = rows_to_change.rename(columns={'number':'letter', 'letter':'number'})
df.loc[rows_to_change.index] = rows_to_change
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446244.html
下一篇:如何在新列中連接兩列和一個變數
