我正在尝试将左侧的Pandas数据框重塑为右侧的数据框。 复制类型很容易 df['type'] = np.where(df.customer.str.match('DRIVER'), 'DRIVER', '') 但是我需要一些方法来捕获ID之间的整个间隔。 这是困难的部分。 一般 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我有一个数据场,如下所示(有更多列被删除):
memberID shipping_country
264991
264991 Canada
100 USA
5000
5000 UK
我正在尝试用每个用户的运送国家/地区的现有值填充空白单元格:
memberID shipping_country
264991 Canada
264991 Canada
100 USA
5000 UK
5000 UK
但是,我不确定在大规模数据集上执行此操作的最有效方法是什么。 也许使用矢量分组方式?
您可以使用GroupBy
+ ffill
/ bfill
:
def filler(x):
return x.ffill().bfill()
res = df.groupby('memberID')['shipping_country'].apply(filler)
自定义功能是必需的,因为没有组合的Pandas方法可以按顺序ffill
和bfill
。
这也满足了特定memberID
所有值均为NaN
的情况; 在这种情况下,它们将保留为NaN
。
对于以下示例数据帧(我在shipping_country
列中添加了一个仅包含''
的memberID
组):
memberID shipping_country
0 264991
1 264991 Canada
2 100 USA
3 5000
4 5000 UK
5 54
这应该对您memberID
,并且还具有以下行为:如果memberID
组在shipping_country
仅具有空字符串值( ''
),则这些值将保留在输出df
:
df['shipping_country'] = df.replace('',np.nan).groupby('memberID')['shipping_country'].transform('first').fillna('')
产量:
memberID shipping_country
0 264991 Canada
1 264991 Canada
2 100 USA
3 5000 UK
4 5000 UK
5 54
如果要在输出df
中将空字符串''
保留为NaN
,则只需删除fillna('')
,则保留:
df['shipping_country'] = df.replace('',np.nan).groupby('memberID')['shipping_country'].transform('first')
您可以使用链接的groupby
,一个使用正向填充,另一个使用回填:
# replace blank values with `NaN` first:
df['shipping_country'].replace('',pd.np.nan,inplace=True)
df.iloc[::-1].groupby('memberID').ffill().groupby('memberID').bfill()
memberID shipping_country
0 264991 Canada
1 264991 Canada
2 100 USA
3 5000 UK
4 5000 UK
此方法还将允许由所有NaN
组成的组保留为NaN
:
>>> df
memberID shipping_country
0 264991
1 264991 Canada
2 100 USA
3 5000
4 5000 UK
5 1
6 1
df['shipping_country'].replace('',pd.np.nan,inplace=True)
df.iloc[::-1].groupby('memberID').ffill().groupby('memberID').bfill()
memberID shipping_country
0 264991 Canada
1 264991 Canada
2 100 USA
3 5000 UK
4 5000 UK
5 1 NaN
6 1 NaN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.