我想通过行计算创建一个新行。我的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
我想计算每行的百分比,使得:
目标
Para 01.21 02.21 03.21 <48h 22 25 38 >48h 0 1 3Perc. 0% 4% 8%
Perc. 0% 4% 8%
我有一些关于添加新DataFrame的想法,但没有真正成功。谢谢您的帮助!
ny6fqffe1#
假设您愿意修改输入DataFrame,这将产生您请求的确切输出:
df.loc['Perc.'] = ( df.loc['>48h'] / df.loc['<48h']).apply(lambda x: f"{x:.0%}")
df.loc['Perc.'] = (
df.loc['>48h'] / df.loc['<48h']
).apply(lambda x: f"{x:.0%}")
这假定打印输出中的第一列是DataFrame的索引。要解开这个一点:1.赋值df.loc['Perc.'] =将创建一个新行,用=右侧的值填充。
df.loc['Perc.'] =
=
.apply
f"{x}"
x
str(x)
f"{x:.0%}"
.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)
)
display_str = df.T.to_string(formatters={"Perc.": lambda x: f"{x:.0%}"})
print(display_str)
这将修改df以添加Perc.行,但其值将保持为实际浮点比。然后display_str将是整个 Dataframe 的适当格式的字符串表示,包括百分比。注意,formatters接受以 column names为键的dict,而不是行,所以你必须先转置你的数据(df.T),结果输出将被转置:
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%
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笔记本中工作,你也可以使用df.style.format方法来实现类似的功能;调用
df.style.format
df.T.style.format({"Perc.": "{:.0%}"})
将返回一个pandas.io.formats.style.Styler对象,但如果您在Jupyter笔记本中,它将像DataFrame一样呈现,相关列的格式如上所述。不过,这只适用于逐列的基础上,所以你需要转置。
pandas.io.formats.style.Styler
j2datikz2#
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)
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 col2Para 01.21 02.21 03.21<48h 22 25 38>48h 0 1 3Perc. 0 4 7.89474
col0 col1 col2
Perc. 0 4 7.89474
1bqhqjot3#
对选定行使用DataFrame.loc:
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.21Para <48h 22.0 25.0 38.0>48h 0.0 1.0 3.0Perc 0.0 4.0 8.0
#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
最好是先转置,所以可以按列选择:
#If first column is not index create it#df = df.set_index('Para')df = df.Tdf['Perc'] = df['>48h'].div(df['<48h']).mul(100).round()print (df)Para <48h >48h Perc01.21 22 0 0.002.21 25 1 4.003.21 38 3 8.0
df = df.T
df['Perc'] = df['>48h'].div(df['<48h']).mul(100).round()
Para <48h >48h Perc
01.21 22 0 0.0
02.21 25 1 4.0
03.21 38 3 8.0
6pp0gazn4#
df.loc[key] = row这是我们如何在pandas数据框中创建新行
kd3sttzy5#
这样存储数据不是最佳做法。读取Hadley's tidy data paper。但是在一条线上你可以这样做。
df.loc['perc'] = df.iloc[2]/df.iloc[1]
5条答案
按热度按时间ny6fqffe1#
假设您愿意修改输入DataFrame,这将产生您请求的确切输出:
这假定打印输出中的第一列是DataFrame的索引。
要解开这个一点:
1.赋值
df.loc['Perc.'] =
将创建一个新行,用=
右侧的值填充。df.loc['>48h'] / df.loc['<48h']
以浮点数形式计算所需的比率.apply
调用对新行的每个元素调用一个函数,将原始百分比转换为按您所要求的方式格式化的字符串。再进一步解释一下:f"{x}"
将x
转换为字符串(本质上等同于str(x)
)f"{x:.0%}"
通过添加.0%
* 格式说明符 * 来增强上述功能,该格式说明符将值显示为小数点后0位的百分比(即乘以100,四舍五入到小数点后0位,然后加上%
符号)。有各种其他格式说明符可用于浮点数据。请注意,如果你想对结果值做任何进一步的处理,我建议 * 不要 * 执行步骤3 -一旦你将数据转换为字符串,它显然不能例如。乘以其他数据。
如果你想两全其美,将内部值保持为浮点比率,但将它们显示为百分比,你可以这样做:
这将修改
df
以添加Perc.
行,但其值将保持为实际浮点比。然后display_str
将是整个 Dataframe 的适当格式的字符串表示,包括百分比。注意,
formatters
接受以 column names为键的dict,而不是行,所以你必须先转置你的数据(df.T
),结果输出将被转置:如果你在Jupyter笔记本中工作,你也可以使用
df.style.format
方法来实现类似的功能;调用将返回一个
pandas.io.formats.style.Styler
对象,但如果您在Jupyter笔记本中,它将像DataFrame一样呈现,相关列的格式如上所述。不过,这只适用于逐列的基础上,所以你需要转置。j2datikz2#
输出量:
1bqhqjot3#
对选定行使用
DataFrame.loc
:最好是先转置,所以可以按列选择:
6pp0gazn4#
df.loc[key] = row
这是我们如何在pandas数据框中创建新行
kd3sttzy5#
这样存储数据不是最佳做法。读取Hadley's tidy data paper。
但是在一条线上你可以这样做。