可以在熊猫数据框中创建子列吗?

新手上路,请多包涵

数据框

我正在使用 Jupyter Notebooks 中的数据框,但遇到了一些困难。数据框由位置组成,这些位置由坐标表示。这些点代表司机在给定日期所走的路线。

目前有 3 列;开始、中间或结束。

司机在起点开始新的一天,访问 1 个或多个中间点,并在一天结束时返回终点。起点就像一个基本位置,因此终点与起点相同。

这是非常基本的,但我无法可视化这些数据。我在想下面这样的事情来帮助改善我的情况:

 |     Start      |       Intermediary       |        End        |
|       |        |            |             |         |         |
_________________________________________________________________
| s_lat | s_lng  |  i_lat     |  i_lng      | e_lat   | e_lng   |

或者如果我取消前 3 列(开始、中间、结束)会更好吗?

我不想按照指南在这里开始讨论,所以我很想学习一些关于 Python Pandas 的新知识,如果有什么方法可以改进我当前的方法。

原文由 Mazz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 315
2 个回答

我认为这里需要 MultiIndexMultiIndex.from_product --- 创建:

 mux = pd.MultiIndex.from_product([['Start','Intermediary','End'], ['lat','lng']])
df = pd.DataFrame(data, columns=mux)

编辑:

设置

 temp=u"""                          start                                   intermediary                           end
('54.957055',' -7.740156')        ('54.956915136264', ' -7.753690062122')     ('54.957055','-7.740156')
('54.8913208', '-7.5740475')    ('54.864402885577', '-7.653445692445'),('54','0')   ('54.8913208','-7.5740475')
('55.2375819', '-7.2357427')     ('55.253936739337', '-7.259624609577'), ('54','2'),('54','1')   ('55.2375819','-7.2357427')
('54.5298806', '-8.1350247')    ('54.504374314741', '-8.188334960168')      ('54.5298806','-8.1350247')
('54.2810187',  ' -7.896937')   ('54.303836850038', '-8.180136033695'), ('54','3')       ('54.2810187','-7.896937')

"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep="\s{3,}")

 print (df)
                           start  \
0     ('54.957055',' -7.740156')
1   ('54.8913208', '-7.5740475')
2   ('55.2375819', '-7.2357427')
3   ('54.5298806', '-8.1350247')
4  ('54.2810187',  ' -7.896937')

                                        intermediary  \
0            ('54.956915136264', ' -7.753690062122')
1  ('54.864402885577', '-7.653445692445'),('54','0')
2  ('55.253936739337', '-7.259624609577'), ('54',...
3             ('54.504374314741', '-8.188334960168')
4  ('54.303836850038', '-8.180136033695'), ('54',...

                           end
0    ('54.957055','-7.740156')
1  ('54.8913208','-7.5740475')
2  ('55.2375819','-7.2357427')
3  ('54.5298806','-8.1350247')
4   ('54.2810187','-7.896937')

 import ast

#convert string values to tuples
df = df.applymap(lambda x: ast.literal_eval(x))
#convert onpy pairs values to nested lists
df['intermediary'] = df['intermediary'].apply(lambda x: list(x) if isinstance(x[1], tuple) else [x])

#DataFrame by first Start column
df1 = pd.DataFrame(df['start'].values.tolist(), columns=['lat','lng'])

#DataFrame by intermediary column with reshape for 2 columns df
df2 = (pd.concat([pd.DataFrame(x, columns=['lat','lng']) for x in df['intermediary']], keys=df.index)
       .reset_index(level=1, drop=True)
       .add_prefix('intermediary_'))
print (df2)

#join all DataFrames together
df3 = df1.add_prefix('start_').join(df2).join(df1.add_prefix('end_'))

#create MultiIndex by split
df3.columns = df3.columns.str.split('_', expand=True)

 print (df3)

        start                 intermediary                           end  \
          lat         lng              lat               lng         lat
0   54.957055   -7.740156  54.956915136264   -7.753690062122   54.957055
1  54.8913208  -7.5740475  54.864402885577   -7.653445692445  54.8913208
1  54.8913208  -7.5740475               54                 0  54.8913208
2  55.2375819  -7.2357427  55.253936739337   -7.259624609577  55.2375819
2  55.2375819  -7.2357427               54                 2  55.2375819
2  55.2375819  -7.2357427               54                 1  55.2375819
3  54.5298806  -8.1350247  54.504374314741   -8.188334960168  54.5298806
4  54.2810187   -7.896937  54.303836850038   -8.180136033695  54.2810187
4  54.2810187   -7.896937               54                 3  54.2810187

          lng
0   -7.740156
1  -7.5740475
1  -7.5740475
2  -7.2357427
2  -7.2357427
2  -7.2357427
3  -8.1350247
4   -7.896937
4   -7.896937

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

要将顶部列添加到 pd.DataFrame 运行:

 def add_top_column(df, top_col, inplace=False):
    if not inplace:
        df = df.copy()

    df.columns = pd.MultiIndex.from_product([[top_col], df.columns])
    return df

orig_df = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'])
new_df = add_top_column(orig_df, "new column")

为了组合 3 个 DataFrame,每个 DataFrame 都有自己的新顶列:

 new_df2 = add_top_column(orig_df, "new column2")
new_df3 = add_top_column(orig_df, "new column3")
print(pd.concat([new_df, new_df2, new_df3], axis=1))

"""
# And this is the expected output:
  new column    new column2    new column3
           a  b           a  b           a  b
0          1  2           1  2           1  2
1          3  4           3  4           3  4
"""

请注意,如果 DataFrame 的索引不匹配,您可能需要重置索引。

原文由 Roei Bahumi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题