从熊猫数据框中的单元格中提取值

时间:2021-03-17 14:52:21

标签: python pandas dataframe

2019-02-12  24;26;28    18;20;22    11;12;13    11;12;13    
2019-02-13  24;26;28    18;20;22    11;12;13    11;12;13

我想提取此数据框每一列的中间值。数据是索引,一串数字是列值。我如何使用熊猫来做到这一点?

所需的输出是:

2019-02-12  26  20  12  12  
2019-02-13  26  20  12  12

3 个答案:

答案 0 :(得分:0)

如果要将其应用于除第一列之外的所有列,可以执行以下操作:

示例:

          date    value1      value2      value3      value4
0   2019-02-12  24;26;28    18;20;22    11;12;13    11;12;13
1   2019-02-13  24;26;28    18;20;22    11;12;13    11;12;13

解决方案:

df.loc[:, df.columns[1:]] = df.loc[:, df.columns[1:]].apply(lambda x: x.str.split(';').str[1])

输出:

          date  value1  value2  value3  value4
0   2019-02-12      26      20      12      12
1   2019-02-13      26      20      12      12

如果您想将它用于某些列,您可以传递它们的名称列表,而不是使用除第一个之外的所有名称:

df.loc[:, [list_of_columns]]

如果日期是您的索引列并且您想将其应用于其余列,请不要使用 [1:]:

 df.loc[:, df.columns]

答案 1 :(得分:0)

如果日期列是索引,则意味着可以从以下位置构建 DataFrame:

df = pd.DataFrame({1: {pd.Timestamp('2019-02-12 00:00:00'): '24;26;28',
                       pd.Timestamp('2019-02-13 00:00:00'): '24;26;28'},
                   2: {pd.Timestamp('2019-02-12 00:00:00'): '18;20;22', 
                       pd.Timestamp('2019-02-13 00:00:00'): '18;20;22'},
                   3: {pd.Timestamp('2019-02-12 00:00:00'): '11;12;13', 
                       pd.Timestamp('2019-02-13 00:00:00'): '11;12;13'},
                   4: {pd.Timestamp('2019-02-12 00:00:00'): '11;12;13',
                       pd.Timestamp('2019-02-13 00:00:00'): '11;12;13'}})

然后你可以清理它:

df = df.apply(lambda x: x.str.replace(r'.*;(.*);.*', r'\1'))

它会按预期给出:

             1   2   3   4
2019-02-12  26  20  12  12
2019-02-13  26  20  12  12

但是恕我直言,这种处理应该在将数据加载到数据帧之前或加载时进行。越早越好...

答案 2 :(得分:0)

按照您提到的格式准备数据..

df = pd.DataFrame(columns=['Date', 'A', 'B', 'C', 'D'])
df.loc[0] = ['2019-02-12' , '24;26;28'  ,' 18;20;22',    '11;12;13',    '11;12;13']
df.loc[1] = ['2019-02-13',  '24;26;28',    '18;20;22',    '11;12;13',    '11;12;13']
df ['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df
                   A          B         C         D
Date                                               
2019-02-12  24;26;28   18;20;22  11;12;13  11;12;13
2019-02-13  24;26;28   18;20;22  11;12;13  11;12;13

首先拆分 ';' 上的值然后获取拆分后的索引 1 处的值。

for col in df.columns:
    df[col]= df[col].str.split(';').str[1].astype(str)
    
df
             A   B   C   D
Date                      
2019-02-12  26  20  12  12
2019-02-13  26  20  12  12

现在您可以使用aggregate加入这些

df['Result'] = df.agg(' '.join, axis=1)
df
             A   B   C   D       Result
Date                                   
2019-02-12  26  20  12  12  26 20 12 12
2019-02-13  26  20  12  12  26 20 12 12