столбец соответствия фрейма данных

#python #python-3.x #pandas #dataframe #numpy

Вопрос:

У меня есть этот DF: Columns: df=pd.DataFrame(columns=["a","b","c","d","e","f","g"])

и это : data=["a:42","b:43","c:22","d:41","a:21","b:14" ,"c:12","e:14" ,"f:7","a:0" ,"d:1","f:3","a:6" ,"b:0","c:9","g:8" ]

Мне нужно

 for d in data:
   spli=d.split(":")
   colum=spli[0]
   value=spli[1]
   df[colum] = value
 

ждем этого результата

 ["a"  "b"   "c"   "d"   "e"    "f"    "g"  ]
  42   43    22    41   nan    nan     nan
  21   14    12    nan   14     7      nan
  0    nan   nan    1    nan     3     nan
  6     0     9    nan   nan   nan      8
 

Комментарии:

1. Всегда ли новая строка начинается с «а»? Или может ли новая строка начинаться с чего-то другого?

2. если бы «а» не существовало, я бы заполнил его nan, но «а» большую часть времени существует

Ответ №1:

Вам нужен непустой df, чтобы задать столбцу определенное значение. Вы можете создать новый df для строки со всеми nan, а затем задать значения столбцов. Вы можете проверить, нужна ли вам новая строка, сравнив числовое значение a, b, c … с помощью ord(). Добавьте df_row в главный df для каждой новой строки и один раз в конце цикла. Вот один из способов сделать это:

 df = pd.DataFrame(columns=["a", "b", "c", "d", "e", "f", "g"])

data = ["a:42", "b:43", "c:22", "d:41", "a:21", "b:14", "c:12", "e:14", "f:7", "a:0", "d:1", "f:3", "a:6", "b:0", "c:9", "g:8"]

df_this_row = pd.DataFrame([[np.NAN, np.NAN, np.NAN, np.NAN, np.NAN, np.NAN, np.NAN]], columns=["a", "b", "c", "d", "e", "f", "g"])
first_col, first_val = data[0].split(':')
df_this_row[first_col] = int(first_val)

for i in range(1, len(data)):
    col, val = data[i].split(':')
    prev_col = data[i-1].split(':')[0]
    if ord(col) <= ord(prev_col):     
        # you are in next row, eg f was previous col, and you have col b
        df = df.append(df_this_row)
        df_this_row = pd.DataFrame([[np.NAN, np.NAN, np.NAN, np.NAN, np.NAN, np.NAN, np.NAN]], columns=["a", "b", "c", "d", "e", "f", "g"])
    df_this_row[col] = int(val)

df = df.append(df_this_row).reset_index(drop=True)

print(df)
#     a    b    c    d    e    f    g
# 0  42   43   22   41  NaN  NaN  NaN
# 1  21   14   12  NaN   14    7  NaN
# 2   0  NaN  NaN    1  NaN    3  NaN
# 3   6    0    9  NaN  NaN  NaN    8
 

Ответ №2:

.loc могу помочь вам здесь:

 last_c = 'z'   # Enter some ordinally large string 
r = -1
for x in data:
    c,v = x.split(':')
    
    if c <= last_c:
        r  = 1
        
    df.loc[r,c] = v
    last_c = c

     a    b    c    d    e    f    g
0   42   43   22   41  NaN  NaN  NaN
1   21   14   12  NaN   14    7  NaN
2    0  NaN  NaN    1  NaN    3  NaN
3    6    0    9  NaN  NaN  NaN    8
4  NaN   14    9  NaN  NaN  NaN  NaN
 

Я добавил дополнительную строку, чтобы показать новую строку (строку), начинающуюся с чего-то другого, чем 'a' .

Комментарии:

1. это решение работает для меня с некоторыми изменениями !!!! thx

Ответ №3:

Возможно ли преобразовать ваши данные в список словарей, таких как:

 data = [{"a":42,"b":43,"c":22,"d":41}, 
 {"a":21,"b":14 ,"c":12,"e":14 ,"f":7},
 {"a":0 ,"d":1,"f":3},
 {"a":6 ,"b":0,"c":9,"g":8}]
 

Затем вы можете создать фрейм данных с помощью:

 df=pd.DataFrame(data).