Используйте .value_counts()
с аргументом нормализации, группируя только по году.
import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame({'year': np.random.choice([2010, 2011], 1000),
'weekday': np.random.choice(list('abcdefg'), 1000),
'val': np.random.normal(1, 10, 1000)})
df.groupby('year').weekday.value_counts(normalize=True)
year weekday
2010 d 0.152083
f 0.147917
g 0.147917
c 0.143750
e 0.139583
b 0.137500
a 0.131250
2011 d 0.182692
a 0.163462
e 0.153846
b 0.148077
c 0.128846
f 0.111538
g 0.111538
Name: weekday, dtype: float64
DECLARE @table_name varchar(max)='tableName'--which needs to be exported
DECLARE @fileName varchar(max)='file Name'--What would be file name
DECLARE @query varchar(8000)
DECLARE @columnHeader VARCHAR(max)
SELECT @columnHeader = COALESCE(@columnHeader+',' ,'')+ ''''+column_name +'''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table_name
DECLARE @ColumnList VARCHAR(max)
SELECT @ColumnList = COALESCE(@ColumnList+',' ,'')+ 'CAST('+column_name +' AS VARCHAR)' +column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table_name
DECLARE @tempRaw_sql nvarchar(max)
SELECT @tempRaw_sql = 'SELECT ' + @ColumnList + ' into ##temp11 FROM ' + @table_name
PRINT @tempRaw_sql
EXECUTE sp_executesql @tempRaw_sql
DECLARE @raw_sql nvarchar(max)
SELECT @raw_sql = 'SELECT '+ @columnHeader +' UNION ALL SELECT * FROM ##temp11'
PRINT @raw_SQL
SET @query='bcp "'+@raw_SQL+'" queryout "C:\data\'+@fileName+'.txt" -T -c -t,'
EXEC xp_cmdshell @query
DROP TABLE ##temp11
Некоторые решения здесь чрезмерно сложны. Вот один с 4 строками кода, никакими пакетными файлами, никакими внешними приложениями и всеми автономными в SQL-сервере.
В этом примере, мою таблицу называют "MyTable", и это имеет два столбца по имени Column1 и Column2. Column2 является целым числом, таким образом, мы должны БРОСИТЬ его к varchar для экспорта:
DECLARE @FileName varchar(100)
DECLARE @BCPCommand varchar(8000)
DECLARE @ColumnHeader varchar(8000)
SET @FileName = 'C:\Temp\OutputFile.csv'
SELECT @ColumnHeader = COALESCE(@ColumnHeader+',' ,'')+ ''''+column_name +'''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='MyTable'
SET @BCPCommand = 'bcp "SELECT '+ @ColumnHeader +' UNION ALL SELECT Column1, CAST(Column2 AS varchar(100)) AS Column2 FROM MyTable" queryout "' + @FileName + '" -c -t , -r \n -S . -T'
EXEC master..xp_cmdshell @BCPCommand
Вы могли добавить это к хранимой процедуре, чтобы полностью автоматизировать Ваш.CSV файл (со строкой заголовка) создание.
Помимо решения от marc_s, вы также можете использовать osql или sqlcmd
. Сюда входят заголовки, и он может действовать как bcp, используя -Q и -о. Однако они не поддерживают файлы формата, такие как bcp.
Насколько мне известно, BCP экспортирует только данные - я не думаю, что есть какой-либо способ заставить его экспортировать строку заголовка с именами столбцов.
Один распространенный метод, который используется для решить эту проблему - использовать представление ваших фактических данных для экспорта, которое в основном выполняет UNION ALL для двух операторов:
], а затем используйте bcp в этом представлении вместо непосредственной базовой таблицы данных.
Marc