只为一些条目转换熊猫系列

时间:2018-01-24 17:17:15

标签: python pandas dataframe

我的数据框有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

实现这一目标的最佳方法是什么?

2 个答案:

答案 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()