【问题标题】:Populate Pandas DataFrame using a dictionary based on a condition根据条件使用字典填充 Pandas DataFrame
【发布时间】:2023-03-19 15:58:01
【问题描述】:

我有一个数据框

>> test = pd.DataFrame({'A': ['a', 'b', 'b', 'b'], 'B': [1, 2, 3, 4], 'C': [np.nan, np.nan, np.nan, np.nan], 'D': [np.nan, np.nan, np.nan, np.nan]})
    A   B   C   D
0   a   1       
1   b   2       
2   b   3       
3   b   4       

我还有一本字典,其中input_b 中的b 表示我只修改row.A = b 所在的行。

>> input_b = {2: ['Moon', 'Elephant'], 4: ['Sun', 'Mouse']}

如何使用字典中的值填充 DataFrame 以获取

    A   B   C       D
0   a   1       
1   b   2   Moon    Elephant
2   b   3       
3   b   4   Sun     Mouse

【问题讨论】:

  • 我了解如何通过首先将字典转换为数据框然后将其与第一个数据框合并来做到这一点。但是,如果第一个数据帧(测试)比我希望修改的部分大得多,这会变得非常慢。
  • 我认为使用pd.from_dict(your_dictionary) 将您的字典转换为数据框,然后与input_b 合并在我看来是最好的解决方案。如果有更好的解决方案,我会感到惊讶。

标签: python pandas dataframe assign


【解决方案1】:

这可能不是最有效的解决方案,但据我了解,它完成了工作:

import pandas as pd
import numpy as np

test = pd.DataFrame({'A': ['a', 'b', 'b', 'b'], 'B': [1, 2, 3, 4],
                     'C': [np.nan, np.nan, np.nan, np.nan], 
                     'D': [np.nan, np.nan, np.nan, np.nan]})


input_b = {2: ['Moon', 'Elephant'], 4: ['Sun', 'Mouse']}


for key, value in input_b.items():
    test.loc[test['B'] == key, ['C', 'D']] = value

print(test)

产量:

   A  B     C         D
0  a  1   NaN       NaN
1  b  2  Moon  Elephant
2  b  3   NaN       NaN
3  b  4   Sun     Mouse

如果字典 input_b 变得太大(更新的行太多,for 循环中的迭代次数过多),这会变慢,但是对于小的 input_b 应该相对较快,即使对于大的 @987654325 @数据框。

此答案还假定 input_b 字典中的键引用原始数据框中 B 列的值,并将在 CD 列中添加重复值以用于重复值B 专栏。

【讨论】:

    【解决方案2】:

    使用apply

    test['C'] = test['B'].map(input_b).apply(lambda x: x[0] if type(x)==list else x)
    test['D'] = test['B'].map(input_b).apply(lambda x: x[1] if type(x)==list else x)
    

    产量

       A  B     C         D
    0  a  1   NaN       NaN
    1  b  2  Moon  Elephant
    2  b  3   NaN       NaN
    3  b  4   Sun     Mouse
    

    【讨论】:

      【解决方案3】:

      使用update

      test=test.set_index('B')
      test.update(pd.DataFrame(input_b,index=['C','D']).T)
      test=test.reset_index()
      test
         B  A     C         D
      0  1  a   NaN       NaN
      1  2  b  Moon  Elephant
      2  3  b   NaN       NaN
      3  4  b   Sun     Mouse
      

      【讨论】:

        【解决方案4】:

        您可以在将索引设置为B 后使用loc 索引:

        test = test.set_index('B')
        test.loc[input_b, ['C', 'D']] = list(input_b.values())
        test = test.reset_index()
        
        print(test)
        
           B  A     C         D
        0  1  a   NaN       NaN
        1  2  b  Moon  Elephant
        2  3  b   NaN       NaN
        3  4  b   Sun     Mouse
        

        【讨论】:

          猜你喜欢
          • 2021-06-04
          • 2022-01-02
          • 1970-01-01
          • 2017-06-29
          • 2020-07-30
          • 1970-01-01
          • 2021-12-14
          • 2018-09-27
          • 1970-01-01
          相关资源
          最近更新 更多