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
答案 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