我有一个数据场,如下所示(有更多列被删除):

    memberID    shipping_country    
    264991      
    264991       Canada
    100          USA    
    5000         
    5000         UK

我正在尝试用每个用户的运送国家/地区的现有值填充空白单元格:

    memberID    shipping_country    
    264991       Canada
    264991       Canada
    100          USA    
    5000         UK
    5000         UK

但是,我不确定在大规模数据集上执行此操作的最有效方法是什么。 也许使用矢量分组方式?

#1楼 票数:5

您可以使用GroupBy + ffill / bfill

def filler(x):
    return x.ffill().bfill()

res = df.groupby('memberID')['shipping_country'].apply(filler)

自定义功能是必需的,因为没有组合的Pandas方法可以按顺序ffillbfill

这也满足了特定memberID所有值均为NaN的情况; 在这种情况下,它们将保留为NaN

#2楼 票数:2

对于以下示例数据帧(我在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')

#3楼 票数:1 已采纳

您可以使用链接的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

  ask by user3000538 translate from so

未解决问题?本站智能推荐:

1回复

Pandas:无法进行位置索引

使用美国人口普查局的人口普查数据。 县是美国各州的政治和地理分区。 该数据集包含 2010 年至 2015 年美国各县和州的人口数据。 有人可以帮我找出嵌套在 for 循环中的 if else 语句中的错误吗? 我想在不使用 groupby 的情况下解决它
3回复

使用 padas 将带有填充零的序列号附加到系列中

我有一个如下所示的数据框 正如您在示例数据框中看到的那样,即使该人的login和logout日期不同, login_id也是相同的。 例如, person = 101 ,在 4 个不同的时间戳登录和退出。 但他有相同的 login_ids,这是不正确的。 相反,我想生成一个new login
2回复

如何解决在多个数据帧之间复制期间无法对齐的索引问题

我有两个数据帧df和hash_file如下所示 我想做两件事 a) 将source_description复制到test_df['desc']列 b) 将对应的hash_id复制到test_df['key_id']列 虽然我已经尝试了下面的方法,但出于某种奇怪的原因,它为我所有的key_id
1回复

如何从 DataFrame.groupby 中“保存”组以分隔变量?

我有一个带有 WhatsApp 消息的 DataFrame,我.groupby发送了该消息。 我可以以某种方式将整个 DataFrame 或仅将一个系列拆分并保存到单独的变量中吗? 所以说我有发件人 A、B、C。我可以分别获得 3 个新的数据帧,分别只有发件人 A、B、C 或只有一列的系列,其中发
2回复

使用groupby后如何从Pandas数据框中选择行?

从下面的数据框中,如何在不求助于复制/粘贴或中间数据结构的情况下获得拥有两个以上宠物的所有者列表? 获取符合条件的布尔序列很容易: 可以通过复制粘贴groupby语句来实际提取比赛( Jack和Joe ): 但是,如果条件语句很长,这是很痛苦的,因为每个更改都需要重复。
1回复

熊猫数据框列以另一列为条件

1)新的列类给出错误-表示TypeError: invalid type comparison 。 如何基于多个小时设置这个新列? 当我只放一个小时(1或2或3 ...)时,此方法有效 2) TypeError: groupby() got multiple values for a
1回复

用于将 Pandas 数据帧转换为嵌套 json 的数据帧查询

提前感谢您的所有帮助。 我只是在 Python 编程方面有所进步,需要您帮助将数据帧转换为 json。 我有以下数据框列和行,如下所示。 我试图按如下方式创建 json, 这是尝试生成json的代码, 不幸的是,我无法弄清楚以下内容, 如何将timestamp和offset附加到
1回复

如何将对象的类型从“pandas.core.groupby.generic.SeriesGroupBy”转换为“pandas.core.series.Series”?

我有一个类型为“pandas.core.groupby.generic.SeriesGroupBy”的变量,我从对熊猫数据框的各个字段进行分组得到。 但是,我想将该变量转换为一个工作正常但有很多错误的熊猫系列。 这是我尝试过的代码: 当我尝试运行此代码时,它需要花费大量时间来执行并产生大量错误