将具有多列的pandas数据框转换为多行

时间:2019-12-06 07:26:40

标签: python pandas

我具有以下格式的数据集

class HomeControllerTableView: UITableViewController{

    var coursesPicture = [CoursePicture]()
    var courseURL = [CourseURL]()

    // MARK: - CoursePicture
    struct CoursePicture: Codable {
        let links: LinksPICTURE

        enum CodingKeys: String, CodingKey {
            case links = "_links"
        }
    }

    // MARK: - Links
    struct LinksPICTURE: Codable {
        let wpFeaturedmedia: [WpFeaturedmedia]

        enum CodingKeys: String, CodingKey {
            case wpFeaturedmedia = "wp:featuredmedia"
        }
    }

    // MARK: - WpFeaturedmedia
    struct WpFeaturedmedia: Codable {
        let href: String
    }


    struct CourseURL: Codable {
        let guid: GUIDURL
    }



    // MARK: - GUID
    struct GUIDURL: Codable {
        let rendered: String
    }

@IBOutlet weak var imageView: UIImageView!

var hello = ""
var hello2 = ""

override func viewDidLoad() {
        super.viewDidLoad()
        imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleTopMargin, .flexibleBottomMargin]
        imageView.contentMode = .scaleAspectFill
        tableView.isScrollEnabled = false
        tableView.rowHeight = UITableView.automaticDimension
        tableView.backgroundColor = .clear
        self.tableView.backgroundView = imageView

        tableView.addSubview(imageView)

        fetchJSON()
        fetchJSONPicture()
        request()
        fetchJSONURL()



    }
public func fetchJSONPicture() {
        let urlString = "EXAMPLE_URL"
        guard let url = URL(string: urlString) else { return }
        URLSession.shared.dataTask(with: url) { (data, _, err) in

                if let err = err {
                    print("Failed to get data from url:", err)
                    return
                }

                guard let data = data else { return }

                do {

                    self.coursesPicture = [try JSONDecoder().decode(CoursePicture.self, from: data)]
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                } catch let jsonErr {
                    print("Failed to decode:", jsonErr)
                }

            }.resume()



    }

    public func fetchJSONURL() {
        let urlString = hello
        guard let url = URL(string: urlString) else { return }
        URLSession.shared.dataTask(with: url) { (data, _, err) in
            DispatchQueue.main.async {
                if let err = err {
                    print("Failed to get data from url:", err)
                    return
                }

                guard let data = data else { return }

                do {

                    self.courseURL = [try JSONDecoder().decode(CourseURL.self, from: data)]
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                } catch let jsonErr {
                    print("Failed to decode:", jsonErr)
                }
            }
            }.resume()
        if let url = URL(string: hello2) {
            URLSession.shared.dataTask(with: url) { (data, urlResponse, error) in
                if let data = data {
                    DispatchQueue.main.async {
                        self.imageView.image = UIImage(data: data)
                    }
                }
            }.resume()
        }

    }

    }
func request() {

        let coursePicture = coursesPicture[0]// Index out of Range error
        let courseUrl = courseURL[0] // Index out of Range error

        hello = coursePicture.links.wpFeaturedmedia[0].href 
        hello2 = courseUrl.guid.rendered
}
}

如何使用大熊猫获取以下格式?

source  adset     date  impression  click   spend
fb      abc       1/1/19    100 140 20
fb      abc       1/2/19    200 130 40
cl      xyz       1/1/19    300 200 50
cl      xyz       1/2/19    500 200 50

1 个答案:

答案 0 :(得分:2)

您可以通过DataFrame.set_indexDataFrame.stackSeries.unstack重塑形状:

df1 = (df.set_index(['source','adset','date'])
        .rename_axis('kpi', axis=1)
        .stack()
        .unstack(level=2)
        .reset_index())
print (df1)
date source adset         kpi  1/1/19  1/2/19
0        cl   xyz  impression     300     500
1        cl   xyz       click     200     200
2        cl   xyz       spend      50      50
3        fb   abc  impression     100     200
4        fb   abc       click     140     130
5        fb   abc       spend      20      40

使用DataFrame.meltDataFrame.pivot_table的另一种解决方案:

df1 = (df.melt(['source','adset','date'], var_name='kpi')
        .pivot_table(index=['source','adset', 'kpi'], columns='date', values='value')
        .reset_index())

print (df1)
date source adset         kpi  1/1/19  1/2/19
0        cl   xyz       click     200     200
1        cl   xyz  impression     300     500
2        cl   xyz       spend      50      50
3        fb   abc       click     140     130
4        fb   abc  impression     100     200
5        fb   abc       spend      20      40