首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动转换为新数据- Pandas

自动转换为新数据- Pandas
EN

Stack Overflow用户
提问于 2018-07-02 01:27:46
回答 1查看 75关注 0票数 0

我是python的新手,我在StackOverflow中搜索我的案例,但是我找不到技术上的答案。我有很多的BS排。

我的问题就像这样,我有一个dataframe

代码语言:javascript
复制
df
BS          N
BS1 - BS5   1
BS2 - BS7   2
BS1 - BS9   2
BS9 - BS1   1

我想要自动生成新数据。我的预期结果如下:

代码语言:javascript
复制
New_BS  BS1 - BS5   BS2 - BS7   BS1 - BS9   BS9 - BS1   Total
BS1-2       1                       2                     3
BS2-3       1           2           2                     5
BS3-4       1           2           2                     5
BS4-5       1           2           2                     5
BS5-6                   2           2                     4
BS6-7                   2           2                     4
BS7-8                               2                     2
BS8-9                               2                     2
BS9-8                                            1        1
BS8-7                                            1        1
BS7-6                                            1        1
BS6-5                                            1        1
BS5-4                                            1        1
BS4-3                                            1        1
BS3-2                                            1        1
BS2-1                                            1        1

提前谢谢你帮我

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-02 06:32:17

嗯-这完全是个黑客-但那很有趣.

代码语言:javascript
复制
import pandas as pd
import numpy as np

df = df_flat = pd.DataFrame({"BS": ['BS1 - BS5', 'BS2 - BS7', 'BS1 - BS9', 'BS9 - BS1'],
                   "N" : [1, 2, 2, 1]})

df = df.pivot(columns='BS',
              values='N')

df_flat = df_flat.pivot_table(
              columns='BS',
              values='N')

for column_name, column in zip(list(df), df):
    if int(column[2:3]) < int(column[8:9]):
        for stop in range(int(column[2:3]), int(column[8:9])):
            index = "BS" + str(stop) + "-" + str(stop + 1)
            if index not in list(df.index.values):
                df.loc[index] = np.nan
            df.loc[index, column] = df_flat.loc['N', column]
    else:
        for stop in range(int(column[2:3]), int(column[8:9]), -1):
            index = "BS" + str(stop) + "-" + str(stop - 1)
            if index not in list(df.index.values):
                df.loc[index] = np.nan
            df.loc[index, column] = df_flat.loc['N', column]

df['Total'] = df.sum(axis=1)

df = df.iloc[len(list(df_flat)):]

print(df.fillna(''))

输出

代码语言:javascript
复制
$ python bus.py
BS    BS1 - BS5 BS1 - BS9 BS2 - BS7 BS9 - BS1  Total
BS1-2         1         2                        3.0
BS2-3         1         2         2              5.0
BS3-4         1         2         2              5.0
BS4-5         1         2         2              5.0
BS5-6                   2         2              4.0
BS6-7                   2         2              4.0
BS7-8                   2                        2.0
BS8-9                   2                        2.0
BS9-8                                       1    1.0
BS8-7                                       1    1.0
BS7-6                                       1    1.0
BS6-5                                       1    1.0
BS5-4                                       1    1.0
BS4-3                                       1    1.0
BS3-2                                       1    1.0
BS2-1                                       1    1.0

有大约1,000种方法来改进--但这是一个好的开始.

请注意,切片是对数据集的一个非常重要的约束--您必须真正地对此进行重新处理,才能使其具有动态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51128177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档