Deepcopy pandas DataFrame contendo objetos python (como listas)
Precisa de ajuda para entender a atribuição de variáveis, ponteiros, ...
O seguinte é reproduzíve
import pandas as pd
df = pd.DataFrame({
'listData': [
['c', 'f', 'd', 'a', 'e', 'b'],
[5, 2, 1, 4, 3]
]})
df['listDataSort'] = df['listData']
gives:
listData listDataSort
0 [c, f, d, a, e, b] [c, f, d, a, e, b]
1 [5, 2, 1, 4, 3] [5, 2, 1, 4, 3]
Se eu quiser apenas classificar as listas nolistDataSort
column, eu poderia tentar:
df['listDataSort'].apply(lambda l: l.sort())
df
o entanto, isso classifica as listas nas duas colunas no loca
listData listDataSort
0 [a, b, c, d, e, f] [a, b, c, d, e, f]
1 [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
Eu posso consertar isso fazendo:
df = pd.DataFrame({
'listData': [
['c', 'f', 'd', 'a', 'e', 'b'],
[5, 2, 1, 4, 3]
]})
df['listDataSort'] = df['listData'].apply(sorted)
giving:
listData listDataSort
0 [c, f, d, a, e, b] [a, b, c, d, e, f]
1 [5, 2, 1, 4, 3] [1, 2, 3, 4, 5]
Atribuindo df a uma variável diferente, digamos que df2 ainda mude tudo de volta à lista de fontes originais. Além disso, como crio um novo quadro de dados com base em um quadro de dados existente para poder fazer alterações no novo quadro de dados sem fazer as mesmas alterações no quadro de dados existente?
df = pd.DataFrame({
'listData': [
['c', 'f', 'd', 'a', 'e', 'b'],
[5, 2, 1, 4, 3]
]})
df2 = df
print('\ndf\n', df)
print('\ndf2\n', df2)
df2['listDataSort'] = df2['listData']
print('\ndf\n', df)
print('\ndf2\n', df2)
df2['listDataSort'].apply(lambda l: l.sort())
print('\ndf\n', df)
print('\ndf2\n', df2)
prints:
df
listData
0 [c, f, d, a, e, b]
1 [5, 2, 1, 4, 3]
df2
listData
0 [c, f, d, a, e, b]
1 [5, 2, 1, 4, 3]
df
listData listDataSort
0 [c, f, d, a, e, b] [c, f, d, a, e, b]
1 [5, 2, 1, 4, 3] [5, 2, 1, 4, 3]
df2
listData listDataSort
0 [c, f, d, a, e, b] [c, f, d, a, e, b]
1 [5, 2, 1, 4, 3] [5, 2, 1, 4, 3]
df
listData listDataSort
0 [a, b, c, d, e, f] [a, b, c, d, e, f]
1 [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
df2
listData listDataSort
0 [a, b, c, d, e, f] [a, b, c, d, e, f]
1 [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
Além disso
df = pd.DataFrame({
'listData': [
['c', 'f', 'd', 'a', 'e', 'b'],
[5, 2, 1, 4, 3]
]})
print('\ndf\n', df)
df3 = df
df3['listDataSort'] = df3['listData'].apply(sorted)
print('\ndf\n', df)
print('\ndf3\n', df3)
prints:
df
listData
0 [c, f, d, a, e, b]
1 [5, 2, 1, 4, 3]
df
listData listDataSort
0 [c, f, d, a, e, b] [a, b, c, d, e, f]
1 [5, 2, 1, 4, 3] [1, 2, 3, 4, 5]
df3
listData listDataSort
0 [c, f, d, a, e, b] [a, b, c, d, e, f]
1 [5, 2, 1, 4, 3] [1, 2, 3, 4, 5]