我有一个数据框,其中单元格用浮点数填充,列名称采用日期时间格式,格式为年+季度 - 例如'1995Q2'。我想划分其中两列的值并将结果存储在一个新列中。我这样做了:
df['ratio'] = df['2008Q3'].div(df['2009Q2'])
但我得到错误:
ValueError: Unknown datetime string format, unable to parse: ratio
和
DateParseError: Unknown datetime string format, unable to parse: ratio
当我尝试这个时:
ratio_column = df['2008Q3'].div(df['2009Q2'])
df['ratio'] = df.add(ratio_column)
我收到错误:
ValueError: can only call with other PeriodIndex-ed objects
有任何帮助吗?谢谢!
可以使用以下示例复制错误:
import numpy as np
import pandas as pd
columns = pd.period_range('1999-1-1', '2000-1-1', freq='Q')
df = pd.DataFrame(np.random.randint(10, size=(4, len(columns))), columns=columns)
df['ratio'] = df['1999Q1'].div(df['1999Q2'])
ratio_column = df['1999Q1'].div(df['1999Q2'])
df['ratio'] = df.add(ratio_column)
答案 0 :(得分:6)
当尝试将字符串列名称(例如'ratio'
)添加到PeriodIndex(对于列)时,会出现问题。 PeriodIndex只能包含Periods
,而不能包含字符串。
添加新列的常用方法
df['ratio'] = ...
不起作用,因为它假定可以将'ratio'
添加到当前列索引。
为了避免这个问题,我们需要将PeriodIndex更改为可以容纳Periods和字符串的通用索引。一种方法是使用pd.concat
:
import numpy as np
import pandas as pd
columns = pd.period_range('1999-1-1','2000-1-1', freq='Q')
df = pd.DataFrame(np.random.randint(10, size=(4, len(columns))), columns=columns)
ratio = pd.DataFrame({'ratio': df['1999Q1'].div(df['1999Q2'])})
df = pd.concat([df, ratio], axis=1)
print(df)
产量
1999Q1 1999Q2 1999Q3 1999Q4 2000Q1 ratio
0 9 0 3 4 6 inf
1 3 9 5 5 3 0.333333
2 2 6 8 7 0 0.333333
3 0 8 7 7 3 0.000000
或者,如果您真的不需要列标签为Periods,那么您可以将它们转换为字符串:
df = pd.DataFrame(np.random.randint(10, size=(4, len(columns))), columns=columns)
df.columns = map(str, df.columns)
df['ratio'] = df['1999Q1'].div(df['1999Q2'])