【问题标题】:Filling in Missing data Pandas using logic使用逻辑填充缺失数据 Pandas
【发布时间】:2018-08-27 13:41:09
【问题描述】:

我有一个包含多列且缺少数据的数据框:

Unit#      Mile        Direction
1 of 2     NaN         NaN
2 of 2     228.7mi     NaN
1 of 2     NaN         NaN
2 of 2     229.7mi     NaN
1 of 2     NaN         NaN
2 of 2     228.7mi     NaN
1 of 3     NaN         NaN
2 of 3     227.7mi     NaN
3 of 3     NaN         NaN

我想做两件事,

  1. 填写 Mile 列以匹配“2 of x”列
  2. 根据英里列的前进方向,使用向上或向下填写方向列。

理想的输出应该是这样的:

Unit#      Mile        Direction
1 of 2     228.7mi     Up
2 of 2     228.7mi     Up
1 of 2     229.7mi     Up
2 of 2     229.7mi     Up
1 of 2     228.7mi     Down
2 of 2     228.7mi     Down
1 of 3     227.7mi     Down
2 of 3     227.7mi     Down
3 of 3     227.7mi     Down

我的主要问题是:

  1. 我如何让它知道我想要替换哪个单元“1 of 2”以及偶尔设置“3”时该怎么办
  2. 由于这个数据框有 500000+ 行,我该如何遍历整个数据集?我最初的想法是一个循环,但这会非常低效并且需要很长时间。

【问题讨论】:

  • 是否有其他唯一标识符来分隔单位?
  • @ScottBoston 如果有帮助,还有一个格式为“YYYY-MM-DD HH:MM:SS.S”的“日期时间”列,但这些是唯一唯一的列

标签: python python-3.x algorithm pandas missing-data


【解决方案1】:

使用cumcountcumsum,创建组密钥

s = df.groupby(['Unit#']).cumcount().diff().ne(0).cumsum()
s
Out[606]: 
0    1
1    1
2    2
3    2
4    3
5    3
6    4
7    4
8    4
dtype: int32

然后我们用 Mile 做 fillna

df.Mile=df.Mile.groupby(s).apply(lambda x : x.ffill().bfill())

s1=pd.to_numeric(df.Mile.str[:-2]).diff().fillna(1)

df.loc[s1>0,'Direction']='Up'
df.loc[s1<0,'Direction']='Down'
df.Direction=df.Direction.ffill()

***Yield:*** 

df
Out[622]: 
  Unit#     Mile Direction
0  1of2  228.7mi        Up
1  2of2  228.7mi        Up
2  1of2  229.7mi        Up
3  2of2  229.7mi        Up
4  1of2  228.7mi      Down
5  2of2  228.7mi      Down
6  1of3  227.7mi      Down
7  2of3  227.7mi      Down
8  3of3  227.7mi      Down

【讨论】:

  • 感谢您抽出宝贵时间提供帮助!不幸的是,当我运行它时,s 矩阵按预期开始,但最终增加一,我最终得到 100000 个左右不同的标识符
  • 当有 2 '3 of 3' 单位彼此相邻时,这会搞砸
  • @JoeS 我没有在我的解决方案中计算那些特殊情况。
猜你喜欢
  • 2020-02-28
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多