【问题标题】:Splitting variables within dataframe into rows using pandas使用 pandas 将数据框中的变量拆分为行
【发布时间】:2017-08-29 18:35:42
【问题描述】:

我在这里看到过类似的问题,但我似乎无法为我的数据获得正确的输出。我有一个看起来像这样的熊猫数据框:

   pm_code                   sec_pm                    site_no       state
0  010_628 010_228 015_634   2543677 2543677 2543677   010228955     me

我想将每个单元格分成多行(按空格分隔)并按状态和站点编号进行索引。

感谢您的帮助!

【问题讨论】:

  • site_no 呢?这也需要重复吗?
  • 抱歉,应该是二级索引。会更新。
  • @Wen No wen,我觉得这有点不一样。
  • @cᴏʟᴅsᴘᴇᴇᴅ 有你 :-)

标签: python pandas


【解决方案1】:

选项 1
set_indexpd.Series.str.split
又名,魔方

df.set_index(
    ['state', 'site_no']
).stack().str.split(expand=True).stack().unstack(-2)

                  pm_code   sec_pm
state site_no                     
me    10228955 0  010_628  2543677
               1  010_228  2543677
               2  015_634  2543677

选项 2
pd.Series.str.extractall 相同的想法

df.set_index(
    ['state', 'site_no']
).stack().str.extractall('(\S+)')[0].unstack(-2)

                      pm_code   sec_pm
state site_no  match                  
me    10228955 0      010_628  2543677
               1      010_228  2543677
               2      015_634  2543677

【讨论】:

  • 嗯,优雅的单班轮……像往常一样。
  • @Vaishali 这是使用pd.Series 方法并返回数据框的便捷方式。但是,来回交换通常很昂贵。
  • @Wen 你甚至可以使用unstack([-3, -1]) 来同时进行关卡交换和取消堆叠。
  • @piRSquared 就像为我打开一扇新的大门~我正在研究它,谢谢!!!
【解决方案2】:

使用str.split 拆分前两列并提取其值。

x = df.iloc[:, :2].applymap(str.split).values.tolist()[0]
x = list(zip(*x))

现在,获取最后两列并扩展它们以匹配拆分后前两列的值。

y = np.repeat(df.iloc[:, -2:].values[:, ::-1], len(x), axis=0) 

现在,创建您的数据框。

df2 = pd.DataFrame(x, index=y, columns=df.columns[:2])
df2    
                pm_code   sec_pm
(me, 10228955)  010_628  2543677
(me, 10228955)  010_228  2543677
(me, 10228955)  015_634  2543677

如果您想要 MultiIndex,则需要致电 pd.MultiIndex

# https://stackoverflow.com/a/45946551/4909087
df2 = pd.DataFrame(x, index=pd.MultiIndex.from_arrays(y.T), columns=df.columns[:2])
df2
             pm_code   sec_pm
me 10228955  010_628  2543677
   10228955  010_228  2543677
   10228955  015_634  2543677

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2016-06-24
    • 2020-05-09
    相关资源
    最近更新 更多