我一直在嘗試在 Pandas 中使用方法鏈,但是有一些與您如何參考 DataFrame 或其列相關的事情一直困擾著我。
例如,在下面的代碼中,我已經過濾了資料集,然后想創建一個新列來匯總過濾后剩余的列。但是我不知道如何參考剛剛從過濾器創建的 DataFrame。下面示例中的 df 指的是原始 DataFrame。
df = pd.DataFrame(
{
'xx':[1,2,3,4,5,6],
'xy':[1,2,3,4,5,6],
'z':[1,2,3,4,5,6],
}
)
df = (
df
.filter(like='x')
.assign(n = df
.sum(axis=1))
)
df.head(6)
或者這個實體如何,在方法鏈中創建 DataFrame,這通常是 pd.read_csv 步驟,而不是生成 DataFrame。這段代碼自然不會作業,因為 df2 還沒有被創建。
df2 = (
pd.DataFrame(
{
'xx':[1,2,3,4,5,6],
'xy':[1,2,3,4,5,6],
'z':[1,2,3,4,5,6],
}
)
.assign(
xx = df2['xx'].mask(df2['xx']>2,0)
)
)
df2.head(6)
有趣的是,上面的問題在這里不是問題,因為 df3['xx'] 指的是已查詢的 df3,這在第二個示例的背景關系中有意義,但在第一個示例中沒有意義。
df3 = pd.DataFrame(
{
'xx':[1,2,3,4,5,6],
'xy':[1,2,3,4,5,6],
'z':[1,2,3,4,5,6],
}
)
df3 = (
df3
.query('xx > 3')
.assign(
xx = df3['xx'].mask(df3['xx']>4,0)
)
)
df3.head(6)
我曾在其他語言/庫中作業過,例如 R 或 PySpark,方法鏈非常靈活,似乎沒有這些障礙。除非我遺漏了它在 Pandas 中的意義,或者你打算如何以其他方式參考 df['xx'] 。
最后,我明白示例問題很容易解決,但我試圖了解是否存在我在參考這些列時可能不知道的 set 方法鏈接語法。
uj5u.com熱心網友回復:
為了根據先前的計算參考 DataFrame,匿名函式(lambda 有幫助):
df.filter(like='x').assign(n = lambda df: df.sum(1))
xx xy n
0 1 1 2
1 2 2 4
2 3 3 6
3 4 4 8
4 5 5 10
5 6 6 12
它基本上參考了之前的 DataFrame。這適用于分配。
該pipe方法是另一種選擇,您可以在參考計算出的 DataFrame 時鏈接方法。
下面的例子是多余的;希望它解釋了如何pipe作業:
df3.pipe(lambda df: df.assign(r = 2))
Out[37]:
xx xy z r
0 1 1 1 2
1 2 2 2 2
2 3 3 3 2
3 4 4 4 2
4 5 5 5 2
5 6 6 6 2
并非所有 Pandas 函式都支持鏈接;這就是管道功能可以派上用場的地方;您甚至可以撰寫自定義函式并將其傳遞給pipe.
所有這些資訊都在檔案中:assign ; 管道; 功能應用;方法鏈中的賦值
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310967.html
