私はこのような表を持っています。完全なサンプルコードとソースデータは2つの回答を含み、一番下にあります。多次元テーブルを持たないパンダの長さ
id technology question response
0 subj1 technology1 Q1 3
1 subj1 technology2 Q1 4
...
10 subj1 technology3 Q3 6
11 subj1 technology4 Q3 2
12 subj1 technology4 Q4 7
13 subj1 technology3 Q4 5
14 subj1 technology1 Q4 5
15 subj1 technology2 Q4 9
16 subj2 technology2 Q1 1
17 subj2 technology1 Q1 4
...
29 subj2 technology3 Q4 0
私が欲しいのは「質問」列の異なる値が自分の右の列になるテーブルであり、質問欄セルの値が与えられたために与えられた質問に対する応答値です私は(これまでの提案に基づき、以下の完全なコードで改善したバージョンに注意してください)このようにテーブルを旋回している場合
id technology Q1 Q2 Q3 Q4
0 subj1 technology1 3 3 2 1
1 subj1 technology2 4 4 3 1
...
10 subj1 technology3 6 3 7 2
...
16 subj2 technology2 4 5 7 3
私は近いものに得ることができます。この(ちょうどイラスト)のように、対象とテクノロジー:
source_data_df_pvt1 = pd.pivot_table(source_data_df, index = ['id'],
columns = ['technology', 'question'],
values = 'response', aggfunc='first')
私にこの多次元データフレームを与える
:私は私のデータフレームはしかしMULT次元になりたくない
technology technology1 technology2 technology3 technology4 technology5
question Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1
id
subj1 3.0 9.0 7.0 5.0 4.0 5.0 3.0 9.0 3.0 8.0 6.0 5.0 5.0 8.0 2.0 7.0 NaN
subj2 4.0 9.0 8.0 7.0 1.0 5.0 8.0 20.0 20.0 9.0 4.0 0.0 3.0 0.0 8.0 6.0 NaN
subj3 14.0 NaN 10.0 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 15.0
subj4 13.0 4.0 5.0 11.0 17.0 NaN NaN NaN 0.0 NaN NaN NaN 0.0 NaN NaN NaN NaN
subj5 3.0 20.0 4.0 8.0 2.0 20.0 3.0 2.0 3.0 5.0 7.0 5.0 4.0 2.0 7.0 5.0 NaN
subj6 2.0 8.0 1.0 6.0 0.0 7.0 4.0 1.0 20.0 6.0 1.0 0.0 6.0 8.0 7.0 3.0 NaN
は、私は、単一のディメンション表が欲しいです。
これはPandasでも可能ですか?
作業溶液を含む完全なサンプルコードと出力、:
import pandas as pd
import numpy as np
pd.set_option('display.width', 1000)
#See https://gist.github.com/NathanDotTo/e506c1946c23234d2c24a2bd27e570a0#file-technology_skills-csv
sample_data = "../test_data/technology_skills.csv"
#The sample data has these columns:
column_names = ["id", "technology", "question", "response"]
source_data_df = pd.read_csv(sample_data, names = column_names, header = None)
#Change response to be numeric
pd.to_numeric(source_data_df.response)
#Strip white spaces from questions
source_data_df['question'] = source_data_df['question'].str.strip()
#Pivot the table to create columns from response values for each question
source_data_df_pvt1 = pd.pivot_table(source_data_df, index = ['id','technology'],
columns = [ 'question'],
values = 'response',
aggfunc='first',
fill_value=np.nan).reset_index()
print('source_data_df_pvt1 *******************')
print (source_data_df_pvt1)
source_data_df_pvt2 = source_data_df.pivot_table(index=['id','technology'],
columns='question',
values='response',
aggfunc='sum',
fill_value=np.nan).reset_index()
print('source_data_df_pvt2 *******************')
print (source_data_df_pvt2)
結果は以下の通りです:ボーナスとして
source_data_df_pvt1 *******************
question id technology Q1 Q2 Q3 Q4
0 subj1 technology1 3 9.0 7.0 5.0
1 subj1 technology2 4 5.0 3.0 9.0
2 subj1 technology3 3 8.0 6.0 5.0
3 subj1 technology4 5 8.0 2.0 7.0
4 subj2 technology1 4 9.0 8.0 7.0
5 subj2 technology2 1 5.0 8.0 20.0
6 subj2 technology3 20 9.0 4.0 0.0
7 subj2 technology4 3 0.0 8.0 6.0
8 subj3 technology1 14 NaN 10.0 0.0
9 subj3 technology5 15 NaN NaN NaN
10 subj4 technology1 13 4.0 5.0 11.0
11 subj4 technology2 17 NaN NaN NaN
12 subj4 technology3 0 NaN NaN NaN
13 subj4 technology4 0 NaN NaN NaN
14 subj5 technology1 3 20.0 4.0 8.0
15 subj5 technology2 2 20.0 3.0 2.0
16 subj5 technology3 3 5.0 7.0 5.0
17 subj5 technology4 4 2.0 7.0 5.0
18 subj6 technology1 2 8.0 1.0 6.0
19 subj6 technology2 0 7.0 4.0 1.0
20 subj6 technology3 20 6.0 1.0 0.0
21 subj6 technology4 6 8.0 7.0 3.0
source_data_df_pvt2 *******************
question id technology Q1 Q2 Q3 Q4
0 subj1 technology1 3 9.0 7.0 5.0
1 subj1 technology2 4 5.0 3.0 9.0
2 subj1 technology3 3 8.0 6.0 5.0
3 subj1 technology4 5 8.0 2.0 7.0
4 subj2 technology1 4 9.0 8.0 7.0
5 subj2 technology2 1 5.0 8.0 20.0
6 subj2 technology3 20 9.0 4.0 0.0
7 subj2 technology4 3 0.0 8.0 6.0
8 subj3 technology1 14 NaN 10.0 0.0
9 subj3 technology5 15 NaN NaN NaN
10 subj4 technology1 13 4.0 5.0 11.0
11 subj4 technology2 17 NaN NaN NaN
12 subj4 technology3 0 NaN NaN NaN
13 subj4 technology4 0 NaN NaN NaN
14 subj5 technology1 3 20.0 4.0 8.0
15 subj5 technology2 2 20.0 3.0 2.0
16 subj5 technology3 3 5.0 7.0 5.0
17 subj5 technology4 4 2.0 7.0 5.0
18 subj6 technology1 2 8.0 1.0 6.0
19 subj6 technology2 0 7.0 4.0 1.0
20 subj6 technology3 20 6.0 1.0 0.0
21 subj6 technology4 6 8.0 7.0 3.0
、これは私が取得できるようにしたかったです、中使用法の簡潔さという用語。両方のピボットスタイルで同じように機能します。 unstack
と
for row in source_data_df_pvt1.itertuples():
print(row)
print(row.id)
print(row.technology)
print(row.Q1)
print(row.Q2)
print(row.Q3)
print(row.Q4)
、私はこれを試してみました更新してください質問をいただき、ありがとうございます。それはうまくいかないようでした。 –
問題の列 'question'には末尾に空白が含まれることがあるので、' 'Q3''と''Q3 ''があります。そのためには最初に 'df ['question'] = df ['question'] .str.strip()'が必要です。 – jezrael
私は本当にそれらのスペースを見つけたはずです、ありがとう。質問は完全な作業コードで更新されました。 –