Home > Back-end >  Pandas groupby unable to concat strings due to TypeError
Pandas groupby unable to concat strings due to TypeError

Time:09-22

I've hit a dead end trying to group records in my df and stacking values from one of the columns. I have a df of ~390k record of such shape:

df = pd.DataFrame({
    'Województwo': {14: 'ŁÓDZKIE', 15: 'ŁÓDZKIE'},
    'Powiat': {14: 'bełchatowski', 15: 'bełchatowski'},
    'Gmina': {14: 'Bełchatów', 15: 'Bełchatów'},
    'Miejscowość (GUS)': {14: 'Bełchatów', 15: 'Bełchatów'},
    'Ulica (cecha)': {14: 'al.', 15: 'al.'},
    'Ulica (nazwa)': {14: 'Aleja ks. Kardynała Stefana Wyszyńskiego', 15: 'Aleja ks. Kardynała Stefana Wyszyńskiego'},
    'Kod pocztowy (PNA)': {14: '97-400', 15: '97-402'},
    'Kod województwa': {14: 'vosti_province_lodzkie',15: 'vosti_province_lodzkie'},
    'Kod powiatu': {14: 'district_lodzkie_belchatowski',15: 'district_lodzkie_belchatowski'},
    'Kod gminy': {14: 'commune_belchatowski_belchatow',15: 'commune_belchatowski_belchatow'},
    'Kod miejscowości': {14: 'town_belchatow_belchatow',15: 'town_belchatow_belchatow'},
    'Kod cechy adresu': {14: 'address_prefix_al', 15: 'address_prefix_al'},
    'Kod adresu': {14: 'address_belchatow_aleja_ks_kardynala_stefana_wyszynskiego',15:'address_belchatow_aleja_ks_kardynala_stefana_wyszynskiego'}})

I want to get rid of duplicates while stacking up values in the column "Kod pocztowy (PNA)". To do so, I figured out such line:

db_miasto = pd.DataFrame(db.groupby(['Województwo', 'Powiat', 'Gmina', 'Miejscowość (GUS)', 'Kod gminy', 'Kod miejscowości'], as_index=False)['Kod pocztowy (PNA)'].apply(lambda x: ",".join(x)))

It does work in case of the example records giving me back such df:

final_df = pd.DataFrame(
    {'Województwo': {0: 'ŁÓDZKIE'},
    'Powiat': {0: 'bełchatowski'},
    'Gmina': {0: 'Bełchatów'},
    'Miejscowość (GUS)': {0: 'Bełchatów'},
    'Kod gminy': {0: 'commune_belchatowski_belchatow'},
    'Kod miejscowości': {0: 'town_belchatow_belchatow'},
    'Kod pocztowy (PNA)': {0: '97-400,97-402'}})

and that is exactly the result I'm expecting. However...

If I try to run that same formula on the entire df of 394k records I hit an error:

TypeError: sequence item 8: expected str instance, float found
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/opt/anaconda3/envs/Productive24_SPK/lib/python3.8/site-packages/pandas/core/groupby/groupby.py in apply(self, func, *args, **kwargs)
   1252             try:
-> 1253                 result = self._python_apply_general(f, self._selected_obj)
   1254             except TypeError:

/opt/anaconda3/envs/Productive24_SPK/lib/python3.8/site-packages/pandas/core/groupby/groupby.py in _python_apply_general(self, f, data)
   1286         """
-> 1287         keys, values, mutated = self.grouper.apply(f, data, self.axis)
   1288 

/opt/anaconda3/envs/Productive24_SPK/lib/python3.8/site-packages/pandas/core/groupby/ops.py in apply(self, f, data, axis)
    819             group_axes = group.axes
--> 820             res = f(group)
    821             if not _is_indexed_like(res, group_axes, axis):

/var/folders/w1/ghc7r0mx6mj933lyktx82w480000gn/T/ipykernel_79776/2296150702.py in <lambda>(x)
----> 1 db_miasto = pd.DataFrame(db.groupby(['Województwo', 'Powiat', 'Gmina', 'Miejscowość (GUS)', 'Kod gminy', 'Kod miejscowości'], as_index=False)['Kod pocztowy (PNA)'].apply(lambda x: ",".join(x)))

TypeError: sequence item 8: expected str instance, float found

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
/var/folders/w1/ghc7r0mx6mj933lyktx82w480000gn/T/ipykernel_79776/2296150702.py in <module>
----> 1 db_miasto = pd.DataFrame(db.groupby(['Województwo', 'Powiat', 'Gmina', 'Miejscowość (GUS)', 'Kod gminy', 'Kod miejscowości'], as_index=False)['Kod pocztowy (PNA)'].apply(lambda x: ",".join(x)))

/opt/anaconda3/envs/Productive24_SPK/lib/python3.8/site-packages/pandas/core/groupby/groupby.py in apply(self, func, *args, **kwargs)
   1262 
   1263                 with group_selection_context(self):
-> 1264                     return self._python_apply_general(f, self._selected_obj)
   1265 
   1266         return result

/opt/anaconda3/envs/Productive24_SPK/lib/python3.8/site-packages/pandas/core/groupby/groupby.py in _python_apply_general(self, f, data)
   1285             data after applying f
   1286         """
-> 1287         keys, values, mutated = self.grouper.apply(f, data, self.axis)
   1288 
   1289         return self._wrap_applied_output(

/opt/anaconda3/envs/Productive24_SPK/lib/python3.8/site-packages/pandas/core/groupby/ops.py in apply(self, f, data, axis)
    818             # group might be modified
    819             group_axes = group.axes
--> 820             res = f(group)
    821             if not _is_indexed_like(res, group_axes, axis):
    822                 mutated = True

/var/folders/w1/ghc7r0mx6mj933lyktx82w480000gn/T/ipykernel_79776/2296150702.py in <lambda>(x)
----> 1 db_miasto = pd.DataFrame(db.groupby(['Województwo', 'Powiat', 'Gmina', 'Miejscowość (GUS)', 'Kod gminy', 'Kod miejscowości'], as_index=False)['Kod pocztowy (PNA)'].apply(lambda x: ",".join(x)))

TypeError: sequence item 8: expected str instance, float found

I have tried modifying my formula by going with .apply(lambda x: ",".join(str(x))) in that lambda function and it does go through the whole file without error but returns it like that:

wrong_df = pd.DataFrame({
    'Województwo': {0: 'ŁÓDZKIE'},
    'Powiat': {0: 'bełchatowski'},
    'Gmina': {0: 'Bełchatów'},
    'Miejscowość (GUS)': {0: 'Bełchatów'},
    'Kod gminy': {0: 'commune_belchatowski_belchatow'},
    'Kod miejscowości': {0: 'town_belchatow_belchatow'},
    'Kod pocztowy (PNA)': {0: '1,4, , , , ,9,7,-,4,0,0,\n,1,5, , , , ,9,7,-,4,0,2,\n,N,a,m,e,:, ,(,Ł,Ó,D,Z,K,I,E,,, ,b,e,ł,c,h,a,t,o,w,s,k,i,,, ,B,e,ł,c,h,a,t,ó,w,,, ,B,e,ł,c,h,a,t,ó,w,,, ,c,o,m,m,u,n,e,_,b,e,l,c,h,a,t,o,w,s,k,i,_,b,e,l,c,h,a,t,o,w,,, ,t,o,w,n,_,b,e,l,c,h,a,t,o,w,_,b,e,l,c,h,a,t,o,w,),,, ,d,t,y,p,e,:, ,o,b,j,e,c,t'}})

and that's some utter BS...

I have no idea how to interpret "sequence item 8" and how to check, which part of df that exactly is... I've checked the type of the columns and it's supposedly strings not floats:

Województwo           object
Powiat                object
Gmina                 object
Miejscowość (GUS)     object
Ulica (cecha)         object
Ulica (nazwa)         object
Kod pocztowy (PNA)    object
Kod województwa       object
Kod powiatu           object
Kod gminy             object
Kod miejscowości      object
Kod cechy adresu      object
Kod adresu            object
dtype: object

I'm really running short on time with this projects thus comming here for help. Any idea how to fix the issue or is there other way to stack up duplicate rows in the way described?

Thank in advance!

CodePudding user response:

You can first transform the column to string:

df["Kod pocztowy (PNA)"] = df["Kod pocztowy (PNA)"].astype(str)
db_miasto = pd.DataFrame(
    df.groupby(
        [
            "Województwo",
            "Powiat",
            "Gmina",
            "Miejscowość (GUS)",
            "Kod gminy",
            "Kod miejscowości",
        ],
        as_index=False,
    )["Kod pocztowy (PNA)"].apply(",".join)
)

Prints:

  Województwo        Powiat      Gmina Miejscowość (GUS)                       Kod gminy          Kod miejscowości Kod pocztowy (PNA)
0     ŁÓDZKIE  bełchatowski  Bełchatów         Bełchatów  commune_belchatowski_belchatow  town_belchatow_belchatow      97-400,97-402

CodePudding user response:

It's type indifference. The main issue - that the value which U want to groupby

As U can see in your example the PNA is string.

{14: '97-400', 15: '97-402'},

So cast overall dataframe into string:

df["Kod pocztowy (PNA)"] = df["Kod pocztowy (PNA)"].astype(str)

Later the operation of groupBy shouldn't throw error.

  • Related