【问题标题】:Pandas: replace values in dataframe from pivot_tablePandas:从 pivot_table 替换数据框中的值
【发布时间】:2017-07-24 13:48:08
【问题描述】:

我有 dataframe 和数据透视表,我需要从 pivot_table 的列中替换 dataframe 中的一些值。

数据框:

       access_code                                ID cat1 cat2 cat3 
 g1gw8bzwelo83mhb  0433a3d29339a4b295b486e85874ec66    1    2             

 g0dgzfg4wpo3jytg  04467d3ae60fed134077a26ae33e0eae    1    2             

 g1gwui6r2ep471ht  06e3395c0b64a3168fbeab6a50cd8f18    1    2              

 g05ooypre5l87jkd  089c81ebeff5184e6563c90115186325    1                  

 g0ifck11dix7avgu  0d254a81dca0ff716753b67a50c41fd7    1    2    3

数据透视表:

type                                                              1      2                                                                                                               \ 
access_code      ID                               member_id         
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1045794        1023   923                                     1                 122      
g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 768656         203    243                              1                 169   
g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 604095         392    919                              1                  35   
g06q0itlmkqmz5cv f4a3b3f2fca77c443cd4286a4c91eedc 1457307        243                          1                       
g074qx58cmuc1a2f 13f2674f6d5abc888d416ea6049b57b9 5637836                                       1                       
g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 5732738        111      2343                               1                      

期望输出:

       access_code                                ID cat1 cat2 cat3 
 g1gw8bzwelo83mhb  0433a3d29339a4b295b486e85874ec66  1023  923             

 g0dgzfg4wpo3jytg  04467d3ae60fed134077a26ae33e0eae  111   2343             

 g1gwui6r2ep471ht  06e3395c0b64a3168fbeab6a50cd8f18  392   919                  

 g05ooypre5l87jkd  089c81ebeff5184e6563c90115186325    1                  

 g0ifck11dix7avgu  0d254a81dca0ff716753b67a50c41fd7    1    2    3

如果我使用

df.ix[df.cat1 == 1] = pivot_table['1']

返回错误ValueError: cannot set using a list-like indexer with a different length than the value

【问题讨论】:

  • “它返回错误。”什么错误?
  • @JohnZwinck ValueError: 无法使用长度与值不同的类似列表的索引器进行设置
  • merge then fillna end drop columns
  • 请提供您的示例数据(以任何人都可以执行代码并拥有相同示例数据的形式,例如“DataFrame”和“PivotTable”)。

标签: python pandas dataframe pivot-table


【解决方案1】:

只要您的数据框不是特别大,您就可以通过一些非常丑陋的方式来实现它。我相信其他人会为您提供更优雅的解决方案,但与此同时,这条管道胶带可能会为您指明正确的方向。

请记住,在这种情况下,我使用 2 个数据帧而不是 1 个数据帧和 1 个数据透视表来执行此操作,因为我已经在从文本数据格式化数据帧时遇到了很多麻烦。

由于您的数据中有空字段,而我的数据框不喜欢这样,请先将空字段转换为零。

df = df.replace(r'\s+', 0, regex=True)

现在确保您的数据实际上是浮动的,否则比较将失败

df[['cat1', 'cat2', 'cat3']] = df[['cat1', 'cat2', 'cat3']].astype(float)

对于冒泡的烟花:

df.cat1.loc[df.cat1 == 1] = piv['1'].loc[df.loc[df.cat1 == 1].index].dropna()
df.cat1 = df.cat1.fillna(1)

df.cat2.loc[df.cat2 == 2] = piv['2'].loc[df.loc[df.cat2 == 2].index].dropna()
df.cat2 = df.cat2.fillna(2)

df = df.replace(0, ' ')

fillna 只是为了重新创建您想要的输出,其中您显然还没有处理一些行。我猜这种逐列的 NaN 填充在你的实际使用中不会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2018-09-29
    • 2021-09-02
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多