Trochę tu utknąłem. Wydaje się łatwe, ale z jakiegoś powodu nie wydaje się, aby zadziałało.

Mam plik csv, z którego muszę odczytać, a następnie dodać zawartość poprzedniego wiersza do następnego. Na przykład, jeśli oryginalne dane wyglądają tak:

   0
0  a
1  b
2  c
3  d

Następnie muszę sprawić, by wyglądało to tak:

   a  b  c
0  a  0  0
1  b  a  0
2  c  b  a
3  d  c  b

Najpierw próbowałem z Pandami, ale szybko się pogubiłem, próbując znaleźć prosty i szybki sposób na iterację po wierszach / kolumnach.

Po tym wszystkim nie do końca zadziałało, zdecydowałem się po prostu przeczytać csv wiersz po wierszu, a następnie rekurencyjnie dodać dane do zawartości poprzedniego wiersza, ale jak dotąd nie udało mi się to, ciągle napotykając problemy z limitami rekursji i tym podobne.

Jaki byłby najlepszy sposób rozwiązania problemu?

2
pavel 2 kwiecień 2020, 04:32

4 odpowiedzi

Najlepsza odpowiedź

IIUC możemy wykonać cumsum, a następnie wykonać split i sorted

s=df.iloc[:,0].add(',').cumsum().str[:-1].str.split(',',expand=True).T.apply(lambda x : sorted(x,key=pd.notnull))
      0     1     2  3
0  None  None  None  a
1  None  None     a  b
2  None     a     b  c
3     a     b     c  d

#s=s.iloc[:,::-1]
1
BENY 2 kwiecień 2020, 01:58

Trochę zmieniłem odpowiedź YOBEN_S na twoje wymagania.

import pandas as pd

df= pd.DataFrame(['A', 'B', 'C', 'D'])
s=df.iloc[:,0].add(',').cumsum().str[:-1].str.split(',',expand=True).T.apply(lambda x : sorted(x,key=pd.notnull))

s=s.iloc[:,::-1]

new_header = s.iloc[:,0] #grab the first col
s.columns = new_header #set the header row as the df header
s.fillna(value=0, inplace=True)

print(s)

Wynik

3  A  B  C  D
0  A  0  0  0
1  B  A  0  0
2  C  B  A  0
3  D  C  B  A
1
Isuru Dilshan 2 kwiecień 2020, 02:12

Może coś takiego? Nie jestem pewien, jaka jest logika w twoim przykładzie dodania następnego wiersza, ale oto moje rozwiązanie oparte na niektórych założeniach, które poczyniłem

import pandas as pd
df = pd.read_csv("yourcsv.csv")

for item in df['firstcolname']:
   temp_list = [0] * len(df.columns)
   while len(temp_list) != len(df['firstcolname']):
      for element in df['firstcolname']:
         temp_list.append(element)

   df[item] = temp_list

1
smaxwell 2 kwiecień 2020, 02:01

Wystarczyłaby pętla for:

for i in range(1,3):
    # may need to replace '0' with 0 or the actual column name
    # also i with f'{i}' if you want column name as string
    df[i] = df['0'].shift(i, fill_value=0)

    # another column to shift:
    df[f'other_col_{i}'] = df['other_col'].shift(i, fill_value=0)

Jeśli masz więcej niż dwie kolumny, może coś podobnego do doskonałej usuniętej odpowiedzi ALollza:

cols = ['col1', 'col2', 'col3']
new_df = pd.concat([df[cols].shift(i, fill_value=0).add_suffix(f'_{i}')
                      for i in range(3)
                   ])

Wynik:

   0  1  2
0  a  0  0
1  b  a  0
2  c  b  a
3  d  c  b
2
Quang Hoang 2 kwiecień 2020, 02:30