我的数据框有Time
系列(由字符串组成),但缺少一些信息:
# Generate a toy dataframe:
import pandas as pd
data = {'Time': ['0'+str(i)+':15:45' for i in range(10)]}
data['Time'][4] = 'unknown'
data['Time'][8] = 'unknown'
df = pd.DataFrame(data)
# df
Time
0 00:15:45
1 01:15:45
2 02:15:45
3 03:15:45
4 unknown
5 05:15:45
6 06:15:45
7 07:15:45
8 unknown
9 09:15:45
我希望unknown
条目与上面的条目匹配,从而生成此数据框:
# desired_df
Time
0 00:15:45
1 01:15:45
2 02:15:45
3 03:15:45
4 03:15:45
5 05:15:45
6 06:15:45
7 07:15:45
8 07:15:45
9 09:15:45
实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
如果您打算使用时间序列数据。我建议将其转换为时间序列,然后转发空白
import pandas as pd
data = {'Time': ['0'+str(i)+':15:45' for i in range(10)]}
data['Time'][4] = 'unknown'
data['Time'][8] = 'unknown'
df.Time = pd.to_datetime(df.Time, errors = 'coerce')
df.fillna(method='ffill')
但是,如果您从csv
文件或使用pandas.read_*
函数的内容获取此数据,则应使用这些函数中的na_values
参数指定unknown
作为NA值
df = pd.read_csv('example.csv', na_values = 'unknown')
df = df.fillna(method='ffill')
你也可以传递一个列表而不是字符串,并添加传递给现有NA值列表的单词
但是,如果你想让列保持字符串,我建议你只做一个查找和替换
df.Time = np.where(df.Time == 'unknown', df.Time.shift(),df.Time)
答案 1 :(得分:0)
这样做的一种方法是使用熊猫' shift
,创建一个新列,其中Time
中的数据移动一个,然后删除它。但可能有一种更清洁的方法来实现这一目标:
# Create new column with the shifted time data
df['Time2'] = df['Time'].shift()
# Replace the data in Time with the data in your new column where necessary
df.loc[df['Time'] == 'unknown', 'Time'] = df.loc[df['Time'] == 'unknown', 'Time2']
# Drop your new column
df = df.drop('Time2', axis=1)
print(df)
Time
0 00:15:45
1 01:15:45
2 02:15:45
3 03:15:45
4 03:15:45
5 05:15:45
6 06:15:45
7 07:15:45
8 07:15:45
9 09:15:45
编辑:正如Zero指出的那样,可以完全跳过新的列步骤:
df.loc[df['Time'] == 'unknown', 'Time'] = df['Time'].shift()