如何在 Pandas 数据框中跨其他行的计算中创建新行?
How to create new row out of calculation across other rows in Pandas Data Frame?
我想通过行计算创建一个新行。
我的 DataFrame 如下所示:
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
我想计算每一行的百分比,以便:
目标
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
Perc. 0% 4% 8%
我有一些关于附加新 DataFrame 的想法,但没有真正成功。
感谢您的帮助!
对 select 行使用 DataFrame.loc
:
#If first column is not index create it
#df = df.set_index('Para')
df.loc['Perc'] = df.loc['>48h'].div(df.loc['<48h']).mul(100).round()
print (df)
01.21 02.21 03.21
Para
<48h 22.0 25.0 38.0
>48h 0.0 1.0 3.0
Perc 0.0 4.0 8.0
最好先转置,这样可以 select 按列排列:
#If first column is not index create it
#df = df.set_index('Para')
df = df.T
df['Perc'] = df['>48h'].div(df['<48h']).mul(100).round()
print (df)
Para <48h >48h Perc
01.21 22 0 0.0
02.21 25 1 4.0
03.21 38 3 8.0
para = ['01.21', '02.21', '03.21']
a = np.array(([22, 25, 38]))
b = np.array(([0, 1, 3]))
df = pd.DataFrame([para, a, b], index=['Para', '<48h', '>48h'], columns=['col0', 'col1', 'col2'])
perc = np.array(((b/a)*100))
df2 = pd.DataFrame([perc], index=['Perc.'], columns=['col0', 'col1', 'col2'])
df = df.append(df2)
print(df)
输出:
col0 col1 col2
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
Perc. 0 4 7.89474
像这样存储数据不是最佳做法,请阅读 Hadley 的整洁数据论文。
但是在一行中你可以这样做。
df.loc['perc'] = df.iloc[2]/df.iloc[1]
df.loc[键] = 行
这就是我们在 pandas 数据框中创建新行的方式
假设您愿意就地修改输入 DataFrame,这将产生您所请求的准确输出:
df.loc['Perc.'] = (
df.loc['>48h'] / df.loc['<48h']
).apply(lambda x: f"{x:.0%}")
这里假定打印输出中的第一列是 DataFrame 的索引。
稍微解压一下:
- 赋值
df.loc['Perc.'] =
将创建一个新行,其中填充了 =
右侧的值。
df.loc['>48h'] / df.loc['<48h']
计算所需的比率,作为浮点数
.apply
调用对新行的每个元素调用一个函数,以将原始百分比数字转换为按您要求的方式格式化的字符串。进一步解压:
f"{x}"
将x
转换为字符串(本质上等同于str(x)
)
f"{x:.0%}"
通过添加 .0%
格式说明符 增强了上述内容,它将以百分比形式显示值,小数点后 0 位(即乘以100,四舍五入到小数点后0位,然后加一个%
号)。还有各种其他格式说明符可用于浮点数据。
请注意,如果您想对结果值进行任何进一步处理,我建议不要执行第 3 步 - 一旦您将数据转换为字符串,显然不能是例如乘以其他数据。
如果您想两全其美,将内部值保持为浮动比率,但将它们显示为百分比,您可以这样做:
df.loc['Perc.'] = (
df.loc['>48h'] / df.loc['<48h']
)
display_str = df.T.to_string(formatters={"Perc.": lambda x: f"{x:.0%}"})
print(display_str)
这将修改 df
以添加 Perc.
行,但其值将保持为实际浮动比率。然后 display_str
将是整个数据帧的适当格式的字符串表示形式,包括百分比。
请注意 formatters
接受由 列 名称而不是行键入的字典,因此您必须首先转置数据 (df.T
),结果输出将被转置:
Para <48h >48h Perc.
0 1.21 22.0 0.0 0%
1 2.21 25.0 1.0 4%
2 3.21 38.0 3.0 8%
如果你在 Jupyter notebook 中工作,你也可以使用 df.style.format
方法来实现类似的东西;打电话
df.T.style.format({"Perc.": "{:.0%}"})
将 return 一个 pandas.io.formats.style.Styler
对象,但是如果您在 Jupyter notebook 中,这将像 DataFrame 一样呈现,相关列的格式如上。同样,这仅适用于逐列的基础,因此您需要转置。
我想通过行计算创建一个新行。 我的 DataFrame 如下所示:
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
我想计算每一行的百分比,以便:
目标
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
Perc. 0% 4% 8%
我有一些关于附加新 DataFrame 的想法,但没有真正成功。 感谢您的帮助!
对 select 行使用 DataFrame.loc
:
#If first column is not index create it
#df = df.set_index('Para')
df.loc['Perc'] = df.loc['>48h'].div(df.loc['<48h']).mul(100).round()
print (df)
01.21 02.21 03.21
Para
<48h 22.0 25.0 38.0
>48h 0.0 1.0 3.0
Perc 0.0 4.0 8.0
最好先转置,这样可以 select 按列排列:
#If first column is not index create it
#df = df.set_index('Para')
df = df.T
df['Perc'] = df['>48h'].div(df['<48h']).mul(100).round()
print (df)
Para <48h >48h Perc
01.21 22 0 0.0
02.21 25 1 4.0
03.21 38 3 8.0
para = ['01.21', '02.21', '03.21']
a = np.array(([22, 25, 38]))
b = np.array(([0, 1, 3]))
df = pd.DataFrame([para, a, b], index=['Para', '<48h', '>48h'], columns=['col0', 'col1', 'col2'])
perc = np.array(((b/a)*100))
df2 = pd.DataFrame([perc], index=['Perc.'], columns=['col0', 'col1', 'col2'])
df = df.append(df2)
print(df)
输出:
col0 col1 col2
Para 01.21 02.21 03.21
<48h 22 25 38
>48h 0 1 3
Perc. 0 4 7.89474
像这样存储数据不是最佳做法,请阅读 Hadley 的整洁数据论文。
但是在一行中你可以这样做。
df.loc['perc'] = df.iloc[2]/df.iloc[1]
df.loc[键] = 行
这就是我们在 pandas 数据框中创建新行的方式
假设您愿意就地修改输入 DataFrame,这将产生您所请求的准确输出:
df.loc['Perc.'] = (
df.loc['>48h'] / df.loc['<48h']
).apply(lambda x: f"{x:.0%}")
这里假定打印输出中的第一列是 DataFrame 的索引。
稍微解压一下:
- 赋值
df.loc['Perc.'] =
将创建一个新行,其中填充了=
右侧的值。 df.loc['>48h'] / df.loc['<48h']
计算所需的比率,作为浮点数.apply
调用对新行的每个元素调用一个函数,以将原始百分比数字转换为按您要求的方式格式化的字符串。进一步解压:f"{x}"
将x
转换为字符串(本质上等同于str(x)
)f"{x:.0%}"
通过添加.0%
格式说明符 增强了上述内容,它将以百分比形式显示值,小数点后 0 位(即乘以100,四舍五入到小数点后0位,然后加一个%
号)。还有各种其他格式说明符可用于浮点数据。
请注意,如果您想对结果值进行任何进一步处理,我建议不要执行第 3 步 - 一旦您将数据转换为字符串,显然不能是例如乘以其他数据。
如果您想两全其美,将内部值保持为浮动比率,但将它们显示为百分比,您可以这样做:
df.loc['Perc.'] = (
df.loc['>48h'] / df.loc['<48h']
)
display_str = df.T.to_string(formatters={"Perc.": lambda x: f"{x:.0%}"})
print(display_str)
这将修改 df
以添加 Perc.
行,但其值将保持为实际浮动比率。然后 display_str
将是整个数据帧的适当格式的字符串表示形式,包括百分比。
请注意 formatters
接受由 列 名称而不是行键入的字典,因此您必须首先转置数据 (df.T
),结果输出将被转置:
Para <48h >48h Perc.
0 1.21 22.0 0.0 0%
1 2.21 25.0 1.0 4%
2 3.21 38.0 3.0 8%
如果你在 Jupyter notebook 中工作,你也可以使用 df.style.format
方法来实现类似的东西;打电话
df.T.style.format({"Perc.": "{:.0%}"})
将 return 一个 pandas.io.formats.style.Styler
对象,但是如果您在 Jupyter notebook 中,这将像 DataFrame 一样呈现,相关列的格式如上。同样,这仅适用于逐列的基础,因此您需要转置。