3 回答

TA貢獻1868條經驗 獲得超4個贊
else你的函數中缺少一個:
def cluster_name(df):
if df['cluster'] == 1:
value = 'A'
elif df['cluster'] == 2:
value = 'B'
elif df['cluster'] == 3:
value = 'C'
elif df['cluster'] == 4:
value = 'D'
elif df['cluster'] == 5:
value = 'E'
elif df['cluster'] == 6:
value = 'F'
elif df['cluster'] == 7:
value = 'G'
else:
value = ...
return value
否則,value如果不在值 {1, 2, ..., 7} 之間,則不會設置df['cluster'],并且會出現異常。

TA貢獻1111條經驗 獲得超0個贊
手動創建
if-else
函數被高估了,并且可能會錯過某個條件。由于您將字母指定為
'cluster_name'
,因此請使用string.ascii_uppercase
來獲取list
所有字母中的 a ,并將zip
它們分配給中的唯一值'cluster'
dict
從壓縮值創建一個并.map
創建'cluster_name'
列。
此實現使用列中的唯一值來創建映射,因此不會出現
"local variable 'value' referenced before assignment"
.在您出現錯誤的情況下,這是因為
return value
當列中存在不符合您的if-else
條件的值時執行,這意味著value
未在函數中分配。
import pandas as pd
import string
# test dataframe
df = pd.DataFrame({'cluster': range(1, 11)})
# unique values from the cluster column
clusters = sorted(df.cluster.unique())?
# create a dict to map
cluster_map = dict(zip(clusters, string.ascii_uppercase))
# create the cluster_name column
df['cluster_name'] = df.cluster.map(cluster_map)
# df
? ?cluster cluster_name
0? ? ? ? 1? ? ? ? ? ? A
1? ? ? ? 2? ? ? ? ? ? B
2? ? ? ? 3? ? ? ? ? ? C
3? ? ? ? 4? ? ? ? ? ? D
4? ? ? ? 5? ? ? ? ? ? E
5? ? ? ? 6? ? ? ? ? ? F
6? ? ? ? 7? ? ? ? ? ? G
7? ? ? ? 8? ? ? ? ? ? H
8? ? ? ? 9? ? ? ? ? ? I
9? ? ? ?10? ? ? ? ? ? J

TA貢獻1796條經驗 獲得超10個贊
似乎您的問題已在評論中得到解答,因此我將提出一種更面向熊貓的方法來解決您的問題。使用apply(axis=1)DataFrame 速度非常慢,而且幾乎沒有必要(與迭代數據幀中的行相同),因此更好的方法是使用矢量化方法。最簡單的方法是在字典中定義 cluster -> cluster_name 映射,并使用以下方法map:
df = pd.DataFrame(
{"cluster": [1,2,3,4,5,6,7]}
)
# repeat this dataframe 10000 times
df = pd.concat([df] * 10000)
應用方法:
def mapping_func(row):
if row['cluster'] == 1:
value = 'A'
elif row['cluster'] == 2:
value = 'B'
elif row['cluster'] == 3:
value = 'C'
elif row['cluster'] == 4:
value = 'D'
elif row['cluster'] == 5:
value = 'E'
elif row['cluster'] == 6:
value = 'F'
elif row['cluster'] == 7:
value = 'G'
else:
# This is a "catch-all" in case none of the values in the column are 1-7
value = "Z"
return value
%timeit df.apply(mapping_func, axis=1)
# 1.32 s ± 91.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
.map方法
mapping_dict = {
1: "A",
2: "B",
3: "C",
4: "D",
5: "E",
6: "F",
7: "G"
}
# the `fillna` is our "catch-all" statement.
# essentially if `map` encounters a value not in the dictionary
# it will place a NaN there. So I fill those NaNs with "Z" to
# be consistent with the above example
%timeit df["cluster"].map(mapping_dict).fillna("Z")
# 4.87 ms ± 195 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
我們可以看到mapwith 字典方法比 while 方法要快得多,apply而且還避免了長if/elif語句鏈。
- 3 回答
- 0 關注
- 189 瀏覽
添加回答
舉報