Estoy trabajando fuera de un archivo csv enorme (873.323 x 271) que se parece a lo que está abajo:
| Part_Number | Type_Code | Building_Code | Handling_Code | Price to Buy | Price to Sell | Name |
|:-----------:|:-------------:|:--------------:|:-------------:|:------------:|:-------------:|:-------------:|
| A | 1, 2 | XX, XX, XX | Y, Y, Y, Y, Y | 304.32 | 510 | Mower |
| B | 1, 1, 1 | XX, XX, XX | Y, Y, Y, Y | 1282.04 | 5000 | Saw |
| C | 1, 2, 3 | XX, XX | Y, Y | 68.91 | 65 | Barrel (Hard) |
| D | 1, 1, 1, 1, 1 | XX, XX, XX, XX | Y, Y, Y | 0 | 300 | Barrel (Make) |
| E | 1 | XX | Y, Y, Y, Y | 321.11 | 415 | Cement Mixer |
| F | 2 | XX, XX, XX | Y | 194.44 | 1095 | Cement Mix |
Hay una mezcla de tipos de columna: Algunos son numérica, algunos son cuerdas, y algunos son cadenas que parecen listas (es decir, Type_Code
, Building_Code
, Handling_Code
, etc.)
Lo que estoy tratando de lograr es:
Si cada valor de la columna es el mismo valor, a continuación, eliminar la lista-como la estructura y reemplazarlo con sólo ese valor. es decir, 1, 1, 1 debería ser simplemente 1. numéricos y no-lista como cuerdas no deberían cambiarse
Morphing la tabla anterior:
| Part_Number | Type_Code | Building_Code | Handling_Code | Price to Buy | Price to Sell | Name |
|:-----------:|:---------:|:-------------:|:-------------:|:------------:|:-------------:|:-------------:|
| A | 1, 2 | XX | Y | 304.32 | 510 | Mower |
| B | 1 | XX | Y | 1282.04 | 5000 | Saw |
| C | 1, 2, 3 | XX | Y | 68.91 | 65 | Barrel (Hard) |
| D | 1 | XX | Y | 0 | 300 | Barrel (Make) |
| E | 1 | XX | Y | 321.11 | 415 | Cement Mixer |
| F | 2 | XX | Y | 194.44 | 1095 | Cement Mix |
(es decir, desde que Building_Code
era sólo agregaciones de XX
, simplemente debe decir XX
)
A continuación es mi actual mi intento:
import pandas as pd
# Read in CSV
df = pd.read_csv('C:\\Users\\wundermahn\\Desktop\\test_stack_csv.csv')
# Turn all columns into a list
for col in df.columns:
col_name = str(col)
temp = pd.DataFrame(df[col_name].tolist())
df.drop(col, axis=1, inplace=True)
df = pd.concat([df, temp], axis=1, join='inner')
# Now loop through the columns and remove items from the list
for col in df.columns:
# If all items are the same
if (len(set(col)) <= 1):
# Set it to be that item
col = col[0]
else:
# If they aren't the same, then just take the items out of the list
col = str(col)
print(df)
Pero me da un error:
Traceback (most recent call last):
File "c:\Users\wundermahn\Desktop\stack_0318.py", line 15, in <module>
if (len(set(col)) <= 1):
TypeError: 'int' object is not iterable
¿Cómo puedo lograr el resultado deseado?
Esto parece ser una función personalizada que se divide ,
y se une de nuevo después de la eliminación de duplicados para el que he utilizadodict.fromkeys
f = lambda x:','.join(dict.fromkeys([i.strip() for i in x.split(',')]).keys())
df.loc[:,df.dtypes.eq('object')]=df.select_dtypes('O').applymap(f)
print(df)
Part_Number Type_Code Building_Code Handling_Code Price to Buy \
0 A 1,2 XX Y 304.32
1 B 1 XX Y 1282.04
2 C 1,2,3 XX Y 68.91
3 D 1 XX Y 0.00
4 E 1 XX Y 321.11
5 F 2 XX Y 194.44
Price to Sell Name
0 510 Mower
1 5000 Saw
2 65 Barrel (Hard)
3 300 Barrel (Make)
4 415 Cement Mixer
5 1095 Cement Mix