Python pandas 中的灵活链接
Flexible chaining in Python pandas
设置
我将两种方法依次应用于 pandas 样式器对象,例如
df.style \
.applymap(mapping1, subset=["column_a"]) \
.applymap(mapping2, subset=["column_b"])
不过,我应用的映射各不相同。例如,我可能意识到我想为列 column_c
添加一个名为 mapping3
的新映射。为了可扩展性,我希望能够快速添加映射并应用它,而不必在上面的代码片段中也添加一行。
我的问题
我想灵活地提供映射并将它们全部应用到 df
,其中输入是映射列表(如 mappings = [(mapping1, col1), (mapping2, col2), (mapping3, col3)]
,输出是样式化数据框。
尽管这个问题使用了样式化数据框的例子,但我认为这个问题本身并不局限于链接样式器对象。我认为它与 pandas.
中所有类型的链接方法相关
可重现的例子
import pandas as pd
df = pd.DataFrame({
"column_a": [-1, -2, 3, 4],
"column_b": ["good", "bad", "neutral", "amazing"],
"column_c": [0.1, 0.9, 0.5, 1]
})
def mapping1(val):
if val < 0:
color = "red"
elif val > 0:
color = "green"
else:
color = "black"
return "background-color: %s" % color
def mapping2(val):
if val == "amazing":
color = "purple"
else:
color = "black"
return "color: %s" % color
def mapping3(val):
if val < 0.8:
color = "orange"
if val >= 0.8:
color = "green"
return "color: %s" % color
styler = df.style \
.applymap(mapping1, subset=['column_a']) \
.applymap(mapping2, subset=["column_b"]) \
.applymap(mapping3, subset=["column_c"])
styler
我们可以在循环中执行applymap
:
mappings = [
(mapping1, 'column_a'),
(mapping2, 'column_b'),
(mapping3, 'column_c')]
x = df.style
for m in mappings:
x = x.applymap(m[0], m[1])
x
这是一种使用 style.apply
并反转 dict
的方法
mappings = [(mapping1, 'column_a'), (mapping2, 'column_b'), (mapping3, 'column_c')]
df.style.apply({v:k for k,v in mappings})
设置
我将两种方法依次应用于 pandas 样式器对象,例如
df.style \
.applymap(mapping1, subset=["column_a"]) \
.applymap(mapping2, subset=["column_b"])
不过,我应用的映射各不相同。例如,我可能意识到我想为列 column_c
添加一个名为 mapping3
的新映射。为了可扩展性,我希望能够快速添加映射并应用它,而不必在上面的代码片段中也添加一行。
我的问题
我想灵活地提供映射并将它们全部应用到 df
,其中输入是映射列表(如 mappings = [(mapping1, col1), (mapping2, col2), (mapping3, col3)]
,输出是样式化数据框。
尽管这个问题使用了样式化数据框的例子,但我认为这个问题本身并不局限于链接样式器对象。我认为它与 pandas.
中所有类型的链接方法相关可重现的例子
import pandas as pd
df = pd.DataFrame({
"column_a": [-1, -2, 3, 4],
"column_b": ["good", "bad", "neutral", "amazing"],
"column_c": [0.1, 0.9, 0.5, 1]
})
def mapping1(val):
if val < 0:
color = "red"
elif val > 0:
color = "green"
else:
color = "black"
return "background-color: %s" % color
def mapping2(val):
if val == "amazing":
color = "purple"
else:
color = "black"
return "color: %s" % color
def mapping3(val):
if val < 0.8:
color = "orange"
if val >= 0.8:
color = "green"
return "color: %s" % color
styler = df.style \
.applymap(mapping1, subset=['column_a']) \
.applymap(mapping2, subset=["column_b"]) \
.applymap(mapping3, subset=["column_c"])
styler
我们可以在循环中执行applymap
:
mappings = [
(mapping1, 'column_a'),
(mapping2, 'column_b'),
(mapping3, 'column_c')]
x = df.style
for m in mappings:
x = x.applymap(m[0], m[1])
x
这是一种使用 style.apply
并反转 dict
mappings = [(mapping1, 'column_a'), (mapping2, 'column_b'), (mapping3, 'column_c')]
df.style.apply({v:k for k,v in mappings})