#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).