我有一個資料框。女巫包含幾列。它看起來像這樣:
| 一個 | 乙 | C | D |
|---|---|---|---|
| 1 | 10 | 一個 | 楠 |
| 2 | 11 | b | 楠 |
| 3 | 12 | C | 楠 |
因此,如果我在 C 列中有“b”,我應該做 A B。在其他情況下 A*B。但是有了它,我就有了累積值的變數(你會看到代碼,它會很清楚)。所以我寫了這段代碼
z = 0
for i, row in df.iterrows():
a = df['A']
b = df['B']
c = df['C']
if c == 'b':
d = a b z
z = z 2
else:
d = a*b
df.at[i, 'D'] = d
但是 df.iterrows() 是反模式,我應該在我的代碼中避免使用這個字串。因為如果我的資料集增加,這將是一個問題,我嘗試使用矢量化,但我不知道如何累積。代碼如下所示:
z = 0
con = (df['C'] == 'b',
df['C'] != 'b')
choise = (
(df['A'] dfs['B'], z 2),
(df['A'] * dfs['B'], )
)
dfs['D'], z = np.select(con, choise)
有人可以幫我嗎?如何累加變數z?
uj5u.com熱心網友回復:
我對第一個代碼塊應該做什么感到困惑:
z = 0
for i, row in df.iterrows():
a = df['A']
b = df['B']
c = df['C']
if c == 'b':
d = a b z
z = z 2
else:
d = a*b
df.at[i, 'D'] = d
iandrows是迭代變數,但你不使用rows, 并且只i在最后使用來設定原始df.
你了解什么iterrows(除了它是一個“反模式”):
看一個小的df:
In [168]: df = pd.DataFrame(np.arange(6).reshape(2,3), columns=['A','B','C'])
In [169]: df
Out[169]:
A B C
0 0 1 2
1 3 4 5
并進行iterrows大量列印:
In [170]: for i, row in df.iterrows():
...: print('==========')
...: print(i, type(row));print(row)
...: a = df['A']
...: print('a', type(a));print(a)
...:
==========
0 <class 'pandas.core.series.Series'>
A 0
B 1
C 2
Name: 0, dtype: int64
a <class 'pandas.core.series.Series'>
0 0
1 3
Name: A, dtype: int64
==========
1 <class 'pandas.core.series.Series'>
A 3
B 4
C 5
Name: 1, dtype: int64
a <class 'pandas.core.series.Series'>
0 0
1 3
Name: A, dtype: int64
rows是一個熊貓系列(例如資料框的一列),資料來自一行。就像將行變成列一樣。df['A']也是一個系列,但其中一個df列。
整個:
a = df['A']
b = df['B']
c = df['C']
if c == 'b':
d = a b z
z = z 2
else:
d = a*b
代碼塊正在處理框架的列 - 整列,而不是一行中的值。在回圈中一次又一次地重復這些計算是沒有意義的。
c是一個系列,因此if c=='b會引發錯誤。使用a我的示例中的:
'==' 測驗產生一個 Series In [172]: a==3 Out[172]: 0 False 1 True Name: A, dtype: bool
在 an 中使用該系列if會引發ambiguity錯誤。
In [173]: if a==3: print('yes')
Traceback (most recent call last):
File "<ipython-input-173-1ccc6f02d1f6>", line 1, in <module>
if a==3: print('yes')
File "/usr/local/lib/python3.8/dist-packages/pandas/core/generic.py", line 1537, in __nonzero__
raise ValueError(
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
因此,您的使用iterrows不僅僅是“反模式”。使用的代碼完全是錯誤的。我介紹了很多細節,因為我認為您需要的不僅僅是“快速”的答案。您需要了解代碼中發生了什么。
uj5u.com熱心網友回復:
為什么不:
z = 0
new_D = []
for row in df.itertuples():
if row.C == 'b':
new_D.append(row.A row.B z)
z = 2
else:
new_D.append(row.A * row.B)
df['D'] = new_D
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/424177.html
上一篇:如何僅將陣列轉換為列中的資料框
