如何将列值分成多行& Python的多个列

时间:2017-05-15 10:35:15

标签: python-3.x pandas

我有一个包含这样的列的csv文件

enter image description here

我需要将列(B)值分成单独的列和多行,如下所示 enter image description here

这就是我尝试过的(以下代码中的数据与上面的csv数据相同)并且无法正常工作

data = [{"latlong":'{lat: 15.85173248  ,  lng: 78.6216129},{lat: 15.85161765  ,  lng: 78.61982138},{lat: 15.85246304  ,  lng: 78.62031075},{lat: 15.85250474  ,  lng: 78.62034441},{lat: 15.85221891  ,  lng: 78.62174507},', "Id": 1},
        {"latlong": '{lat: 15.8523723  ,  lng: 78.62177758},{lat: 15.85236637  ,  lng: 78.62179098},{lat: 15.85231281  ,  lng: 78.62238316},{lat: 15.8501259  ,  lng: 78.62201676},', "Id":2}]
df = pd.DataFrame(data)
df
df.latlong.apply(pd.Series)

这适用于这种情况

data1 = [{'latlong':[15.85173248, 78.6216129, 1]},{'latlong': [15.85161765, 78.61982138, 1]},{'latlong': [15.85246304, 78.62031075, 1]},
    {'latlong': [15.85250474, 78.62034441, 1]}, {'latlong': [15.85221891, 78.62174507, 1]},{'latlong': [15.8523723, 78.62177758, 2]},
    {'latlong': [15.85236637, 78.62179098, 2]}, {'latlong': [15.85231281, 78.62238316, 2]},{'latlong': [15.8501259,78.62201676, 2]}]
df1 = pd.DataFrame(data1)
df1

df1 = df1['latlong'].apply(pd.Series)
df1.columns = ['lat', 'long', 'Id']
df1

如何使用Python实现这一目标?

python新手。我尝试了以下链接...无法理解如何将其应用于我的案例。 Splitting dictionary/list inside a Pandas Column into Separate Columns

python split data frame columns into multiple rows

1 个答案:

答案 0 :(得分:0)

你的数据是一种非常奇怪的格式...... latlong的条目实际上并不是有效的JSON(末尾有一个尾随的逗号,并且字段名称周围没有引号),所以我可能实际上使用正则表达式来拆分列,并使用列表解析来拆分行:

In [39]: pd.DataFrame(
             [{'Id':r['Id'], 'lat':lat, 'long':long}  
                for r in data 
                for lat,long in re.findall("lat: ([\d.]+).*?lng: ([\d.]+)",
                                           r['latlong'])])
Out[39]:
   Id          lat         long
0   1  15.85173248   78.6216129
1   1  15.85161765  78.61982138
2   1  15.85246304  78.62031075
3   1  15.85250474  78.62034441
4   1  15.85221891  78.62174507
5   2   15.8523723  78.62177758
6   2  15.85236637  78.62179098
7   2  15.85231281  78.62238316
8   2   15.8501259  78.62201676