【问题标题】:Extracting from a 2D df and adding value to 1D df in python从 2D df 中提取并在 python 中将值添加到 1D df
【发布时间】:2021-09-14 20:33:16
【问题描述】:

我正在尝试从二维数据框中提取信息,其中我有 A 到 H 行和 1-12 列。每个单元格都有不同的编号。我的第二个数据框只有一列包含组合信息,例如 A1、A2 等。我想设置一个 for 循环,以便我可以执行 df1.iloc 并选择坐标。但我不想输入 96 行,所以我认为 for 循环会有所帮助,但我不知道该怎么做。 我还很新,所以我不太了解这些技巧。

df1 将是:

1 2 3 4 5 6
A 237 543 300 256 343 122
B 435 313 150 635 847 321

df2 将是:

well=['A1','A2','A3','B1','B2','B3']

我想做一个 df3,看起来像:

Well Value
A1 237
A2 543
A3 300
B1 435
B2 313
B3 150

到目前为止,我拥有的是:

    df3=pd.DataFrame()
    for i in df2:
        if i.contains('A'):
           row=df1.iloc[1]
           if i.contains('1'):
              value=row.iloc[1]
        df3.append(i,value)

我知道 col # 对于 iloc 将始终相同。 那么我可以将 A-H 分配为 1-8,然后以某种方式选择 df2 中字母后面的数字作为 iloc 值吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    一个选项是stack df1reindex 来自well

    df3 = df1.stack()
    df3.index = df3.index.map(lambda s: ''.join(map(str, s)))
    df3 = df3.reindex(df2['well']).reset_index(name='Value')
    

    df3:

      Well  Value
    0   A1    237
    1   A2    543
    2   A3    300
    3   B1    435
    4   B2    313
    5   B3    150
    

    使用的数据帧:

    import pandas as pd
    
    df1 = pd.DataFrame({
        1: {'A': 237, 'B': 435}, 2: {'A': 543, 'B': 313},
        3: {'A': 300, 'B': 150}, 4: {'A': 256, 'B': 635},
        5: {'A': 343, 'B': 847}, 6: {'A': 122, 'B': 321}
    })
    
    df2 = pd.DataFrame({'well': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})
    

    解释:

    1. 堆栈产生一个系列:
    df3 = df1.stack()
    

    df3:

    A  1    237
       2    543
       3    300
       4    256
       5    343
       6    122
    B  1    435
       2    313
       3    150
       4    635
       5    847
       6    321
    dtype: int64
    

    1. 使用 Index.map 将 MultiIndex 折叠成单个索引:
    df3.index = df3.index.map(lambda s: ''.join(map(str, s)))
    

    df3:

    A1    237
    A2    543
    A3    300
    A4    256
    A5    343
    A6    122
    B1    435
    B2    313
    B3    150
    B4    635
    B5    847
    B6    321
    dtype: int64
    

    1. df2reindex 获取well
    df3 = df3.reindex(df2['well'])
    
    Well
    A1    237
    A2    543
    A3    300
    B1    435
    B2    313
    B3    150
    dtype: int64
    

    *如果 well 是 OP 中出现的 list,则将其转换为名称为 wellreindexSeries

    well = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']
    df3 = df3.reindex(pd.Series(well, name='well'))
    

    或直接来自listreindex 但在重置索引之前需要重命名轴:

    well = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']
    df3 = df3.reindex(well).rename_axis(index='Well')
    

    1. reset_index 转换为 DataFrame(并为 Value 列命名):
    df3 = df3.reindex(df2['well']).reset_index(name='Value')
    

    df3:

      Well  Value
    0   A1    237
    1   A2    543
    2   A3    300
    3   B1    435
    4   B2    313
    5   B3    150
    

    【讨论】:

    • 如果 'df1 = pd.DataFrame({ 1: {'A': 237, 'B': 435, 'C':900}, 2: {'A': 543, ' B': 313, 'C':1200}, 3: {'A': 300, 'B': 150, 'C':1600}, 4: {'A': 256, 'B': 635, ' C':900}, 5: {'A': 343, 'B': 847, 'C':1200}, 6: {'A': 122, 'B': 321, 'C':1600} } )' 我想要数据框:'df3=pd.DataFrame({'name':{'A1':237,'A2':543,'A3':300,'A4':256,'A5':343 ,'A6':122,'B1':435,'B2':313,'B3':150,'B4':635,'B5':847,'B6':321},'时间':{' A1':900,'A2':1200,'A3':1600,'A4':900,'A5':1200,'A6':1600,'B1':900,'B2':1200,'B3' :1600,'B4':900,'B5':1200,'B6':1600} })'
    • 这实际上似乎是一个不同的问题,因为如何根据 C 索引保存其他列。我在 cmets 中没有足够的空间来完全思考我的想法,改变这个已经被问和回答的问题是没有意义的。我很高兴看到您的新问题,该问题具体概述了这种转变是如何发生的,以及任何其他难以包含在 cmets 中的相关因素。
    猜你喜欢
    • 2022-01-26
    • 2022-11-15
    • 2020-06-02
    • 2021-08-18
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多