3 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
else你的函數(shù)中缺少一個(gè):
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} 之間,則不會(huì)設(shè)置df['cluster'],并且會(huì)出現(xiàn)異常。

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
手動(dòng)創(chuàng)建
if-else
函數(shù)被高估了,并且可能會(huì)錯(cuò)過(guò)某個(gè)條件。由于您將字母指定為
'cluster_name'
,因此請(qǐng)使用string.ascii_uppercase
來(lái)獲取list
所有字母中的 a ,并將zip
它們分配給中的唯一值'cluster'
dict
從壓縮值創(chuàng)建一個(gè)并.map
創(chuàng)建'cluster_name'
列。
此實(shí)現(xiàn)使用列中的唯一值來(lái)創(chuàng)建映射,因此不會(huì)出現(xiàn)
"local variable 'value' referenced before assignment"
.在您出現(xiàn)錯(cuò)誤的情況下,這是因?yàn)?code>return value當(dāng)列中存在不符合您的
if-else
條件的值時(shí)執(zhí)行,這意味著value
未在函數(shù)中分配。
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貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
似乎您的問(wèn)題已在評(píng)論中得到解答,因此我將提出一種更面向熊貓的方法來(lái)解決您的問(wèn)題。使用apply(axis=1)DataFrame 速度非常慢,而且?guī)缀鯖](méi)有必要(與迭代數(shù)據(jù)幀中的行相同),因此更好的方法是使用矢量化方法。最簡(jiǎn)單的方法是在字典中定義 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)
應(yīng)用方法:
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而且還避免了長(zhǎng)if/elif語(yǔ)句鏈。
- 3 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報(bào)