apply
он применяется к каждой строке или каждой колонке параметр axis
, то есть когда ты пишешь свою кастомную функцию на вход она будет получать либо numpy массив либо pandas Series. Вообще apply
для фрейма имеет довольно много интересных параметров почитай доки этого метода он реально мощный. pipe(func, *args, **kwargs)
и тебе приходит копия оригинального фрейма с твоими изменениями описанными в func
, это очень хорошая практика. df.loc[:,['A','B','C']] = np.sort(df[['A','B','C']].values,axis=1)
result = df.assign(**{
'Системы:':lambda x:x['Системы:'].str.strip(),
'Текущий %:':lambda x:x['Текущий %:'].str.strip(),
'Плановый %:':lambda x:x['Плановый %:'].str.strip()
})
print(result)
index = pd.date_range('1/1/2000', periods=9, freq='min')
df= pd.DataFrame(data=np.random.randint(1,10,(9,2)), index=index, columns=['A','B'])
df.resample('3min').agg({'A':'sum','B':'mean'})
Я создал фрейм с индексом временная последовательность (1 мин). сгруппировал по 3минуты и применил к каждой из колонок разные аггрегирующие функции.pd.options.mode.copy_on_write = True
info = {'color': ['blue', 'green', 'yellow', 'red', 'white'],
'object': ['ball', 'pen', 'pencil', 'paper', 'mug'],
'price': [1.2, 1.0, 0.6, 0.9, 1.7]}
frame = pd.DataFrame(info)
frame.loc[2,'price'] = 100
print(frame)
df = df.read_csv(filename, sep=';')
Ну и остальные параметры которые ты там указываешь. Решит ли это все проблемы неизвестны. Надо видеть в каком состоянии файл. Чтение файлов иногда может быть серьезной проблемой, которая потребует написания функций для проблемной части парсинга. f = pd.DataFrame({
'A':['a',np.NaN,np.NaN,'b',np.NaN,np.NaN,np.NaN,'v',np.NaN,np.NaN,'d',np.NaN,np.NaN],
'B':['foo','foo','bar','bar','bar','foo','bar','foo','bar','foo','bar','foo','bar']
})
result = (
df
.groupby(df['A']
.fillna(method='ffill'))['B']
.apply(lambda x: ','.join(x))
.reset_index()
)
result
import re
searchstr=(
ff.loc[ff['B']
.str.contains(r'строка',regex=True,flags=re.IGNORECASE),['А','B']
]
)
Выберет подсет датафрейма ff (колонки 'A' и 'B'), где в 'В' содержится 'строка'. low = df['Age'].quantile(0.05)
upper = df['Age'].quantile(0.95)
df[df['Age'].between(low, upper)]
np.percentile()
for i in time:
data = change_data(i)
Ну ты перезаписываешь свои данные да и все. То есть в data у тебя остается последний результат вызова функции для последнего i. benz_df['time'] = data
колонке time, значение data. Он его броадкастит на всю колонку да и все. Ты ожидаешь что data это массив c данными, а это одно значение. data= []
for i in time:
data.append(change_data(i))
benz = pd.read_xml(benz_xml_file, xpath='.//filling')
benz_df = pd.DataFrame(benz)
benz_df['time'] = benz_df['time'].apply(change_data)
benz_df['time'][:50]
df = df.dropna()
Ну на всякий случай проверь после этой строчки df.isnull().sum()
Должны быть нули, далее там же проверь не попало ли строковое значение (df == 'NaN').sum()
df = df.where(df['area_name'].apply(lambda x: x in used_cities))
появляется NaN, что собственно логично, ты предоставляешь , булевый массив True, False. где pandas оставит оригинальное значение где состояние True и заменит на твое (которое ты не предоставил) где значение False. То есть вторым параметром ты должен был предоставить значение, (по умолчанию оно NaN). df = df.where(df['area_name'].apply(lambda x: x in used_cities), 'Твое значение')
df = pd.DataFrame({
'tank_value':tank
})
В принципе все. Но это плохой способ, правильно вообще не процессировать данные python циклами и читать весь json в фрейм и потом делать выборку из него. dfs = []
for filename in fileanmes:
df = pd.read_excel(filename)
dfs.append(df)
from functools import reduce
import numpy as np
df1 = pd.DataFrame({
'A':[1],
'B':[2]
})
df2 = pd.DataFrame({
'A':[1],
'C':[2]
})
df3 = pd.DataFrame({
'A':[1],
'D':[2]
})
dfs_column_names = [df1.columns, df2.columns, df3.columns]
print(reduce(np.intersect1d, dfs_column_names))
Вот так ты можешь найти общие колонки у любого количества фреймов.pd.concat(dfs).
Где dfs это список фреймов, с едиными колонками. То есть предварительно, ты как я показал нашел common_columns. и затеам dfs=[df[common_columns] for df in dfs].
И затем конкатенируешь. df = pd.read_csv('directory2.csv').set_index('Имя', drop=False).rename_axis('_Имя', axis=0)
что бы у нас колонка имя не пропадала, и меняем имя у индекса, что бы он отличался от имени колонки. df.to_csv('directory2.csv', index=False)
bad_rounding_result = pivot_table_type_of_expenses.iloc[6, 1]
df1 = pd.DataFrame({'A':[bad_rounding_result]})
print(df1)
print(df1.iloc[0,0])
В df1 оно будет нормально, будешь доставать будет вот такое. Если тебе надо после вычеслений рапортовать это где то ну отформатируй его строкой да и все. import chardet
with open(filename, 'rb') as rawdata:
result = chardet.detect(rawdata.read(100000))
result