【问题标题】:Split a text(with names and values) column into multiple columns in Pandas DataFrame在 Pandas DataFrame 中将文本(带有名称和值)列拆分为多列
【发布时间】:2020-05-23 14:00:43
【问题描述】:

我的算法速度有问题,太慢了。我有一个大数据框,想要创建列取决于其他的名称和值。我正在寻找可能在 Pandas 中的解决方案。在运行之前,我不知道未来列的大小。这是一个简单的模式。

"column"<==>"value"<br>"column"<==> "value"<br>...

我的数据框

id |     params     |
---|-----------------
0  |currency<=>PLN<br>price<=>72.14<br>city<==>Berlin
---|-----------------
1  |price<=>90<br>area<=>72.14<br>city<==>San Francisco<br>rooms<==>2<br>is_Free<==>1
---|-----------------

我想要这样的东西

   id | price | currency |      city    | rooms | is_Free| area|
   ---|------ |----------|--------------|-------|--------|------
     0| 72.14 |  PLN     |     Berlin   |  NaN  |   NaN  |  NaN|
   ---|-------|----------|--------------|-------|--------|------
     1|  90   |  NaN     | San Francisco|   2   |    1   |  90 |

我的解决方案:

def add_parameters(df):
    for i,row in df.iterrows():
        parameters_list = row.params.split("<br>")
        for parameter in parameters_list:
            elem_list = parameter.split("<=>")
            if elem_list[0]  and elem_list[1] != '':
                df.loc[i, elem_list[0]] = elem_list[1]
    return df

谢谢

【问题讨论】:

  • 是否有时会出现“”有时会出现“”?

标签: python pandas dataframe multiple-columns


【解决方案1】:

这是解决问题的一种方法。

import re

# handle multiple seperator.
sep = re.compile(r"(<.*>)")


def split(value):
    ret = {}
    for s in value.split("<br>"):
        # search if seperator exists in the string & split based on sep.
        if sep.search(s):
            split_ = s.split(sep.search(s).group())
            ret[split_[0]] = split_[1]

    return ret

print(df['params'].apply(lambda x : split(x)).apply(pd.Series))

输出

  currency  price           city   area rooms is_Free
0      PLN  72.14         Berlin    NaN   NaN     NaN
1      NaN     90  San Francisco  72.14     2       1

【讨论】:

    【解决方案2】:

    如果您想在一行中使用 list comp(但我不确定它是否可读):

    pattern = re.compile(r"<=*>")
    df = df['params'].apply(lambda row: dict([pattern.split(kv) for kv in row.split("<br>")])).apply(pd.Series)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 2016-11-17
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多