Introduction to Pandas
CC Attribution 2.0 Belgium:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal purpose as long as the work is attributed to the author in the manner specified by the author or licensor.
Dua, Sahil
This talk will be based on open source data manipulation and analysis pythonlibrary – Pandas. It will mainly focus on exploring the most commonly usedfeatures of the library like – integrated indexing using DataFrame objects,slicing and subsetting of large data sets, merging, joining and sizemutability of data structures, hierarchical axis indexing to work with high-dimensional data in a lower-dimensional data, flexible reshaping and pivotingof data sets etc.
 Indices by default will be always be 0, 1, and 2. And similarly, if you want to select multiple columns, you can simply pass the list of the names of the columns that you want to fetch. And any guesses for the structure will be there. Exactly, easy, right? So yeah, it will be a lot of frame. And if you want to fetch a row, you can just simply pass the index of the row. We just pass the index of the row to the location man, which is LOC. And it will give you another series. But as you can see, the indices now are changed. Insts will be the column names now, because in this case, when we fetch a row, data is really x, 6, and true in this case. And the indices will be the names of the column, because those are the identifiers for any value. So now if you want to fetch the multiple rows, what we can do is just do it the pythonic. Just mention whichever rows we want. And it will, of course, fetch the 0, 10 first row, like this. So that was just like when you know that what you're going to fetch, but what about if you have some conditions like if you want to fetch some data based on the value in some column, then you can just do this. So in the square baggage, just mention the condition that you have. And easy to guess that it'd be data frame. It will just return those rows, which satisfies the condition. Condition can be on any number of columns, as we can see the source of a complicated example, which is let's say we want to, let's say a hypothetical condition, we want to fetch the rows which have x or z value in their first column. We can do this. Like it can be any sort of complicated condition, and it will just fetch according to your condition. In this case, this. So let's say we have these two data frames now, as you can see, there are a, b, c, and d indices for the first one, and a, b, c columns, and the second one a, b, c, d, e as indices, and a, b as columns. So if we decide to merge this, if we decide to add this, which is like addition operation, not exactly arithmetic, but we'll see how it is not exactly arithmetic. It will return you this. So as you can see, some of the values are some of corresponding values in both the data frames, but some of them are not defined. It's like a not a number, which is a non-type in numpy, and which is sort of portable because it relies on numpy. So why are some values not a number? The reason is, for example, for e row, for e index, there's no value in the first data frame, so it doesn't know what value to add, what value to fetch, and that's why it cannot perform addition operation or a merge operation on e. So that's why all the elements of e in the resultant data frame will be not a number, and the same the case with the c column as well. So we see a lot of not a number values, right? How can we handle it? Like if we could every day, right? We know if something goes wrong, either we like draw it, either we like eliminate the risk, eliminate the bug, or we fix it, right? It's like as simple as that. So let's see how we can handle these values. We can either draw them, either we can say, OK, if anything is not a number, we don't want to keep it, or we can just say that if anything's not a number, we're going to fill it with some value on the basis of some logic. So let's say the first thing, like if you want to drop the values, you can just pass on the matter like drop NA, and by default, it's got to drop all the rows, which have at least one not a number value, so it has at least one un-fine value. It's going to drop all those rows, as we can see this. And there may be a case when you want to say, OK, second row, like the index two row has some values, has some data. So you want to keep it because it has some data and we're not going to lose it. For that, we have another method, which is like you can pass a parameter saying, like, how do you want to drop the values? You want to drop the values only if all of the values are un-fine. So it will just pop the last row. So it's not going to lose any data, which you are losing in the first case. And let's talk about the case, like when you fill the values in some manner. So we have this data frame again. And what we can do is we can just pass a default value, which we want to, like, this is like one case, and you know that there is something un-defined. You want to fill it with something like let's say zero or minus one or something, which is like the default value for your data, and it will just simply replace every not-defined value with that default value that you pass. And if you don't really want to do that, like if you're like, no, why should I fill with zero? Fine. You can use the NA method with the parameter, which is like forward fill, F fill is for forward fill. And what we will do is it will take the value just above the not-defined value and copy it all over. So as you can see, in the second row, there was a not-fine, like not a number, but now it is 10 because the 10 is copied from the last defined value. And similarly, you have backward fill methods as well, and it's like pass the method equal to the B fill and should be fine. And yeah, so this was a case when it just copied over everything, right? But there may be a case when you just want to copy one, like a copy twice, and you know that if something is really wrong, then you want to drop all the rest of the values, but you want to, surely, you want to copy some of the values. So you can define the limit. And since the limit is one in this case, you can see one not-did-not-anum value is still left because, of course, because of one limit, and it won't copy more than once. Let's talk about indexing now. Like I've talked about indices like we have 0, 1, 2, or we have ABC. We can have custom indices. Let's talk about a little bit more in detail about that. So for this data frame, we have this index, and we can just fetch the index. We want to do something to the index. In this case, it's not really going to be useful, but as we can see, we'll see later it will be really like indices can be anything, and this is a way to access any index of the data frame. So let's say we have this data frame once again, and what we want to do is we want to change the index, and we want to assign some column as index. Like we want to use one column as index. Just like we use in databases, we define some column as an index, and so that searching is easy and everything is searching, and sorting everything is easy. So we can do the same thing here. We can just pass the name of the index that we want, and as you can see, the new data frame that we will have will have that column as index. So everything you are doing, you in the index now, will be done using these values, ABC and D. Let's see how we can do that. So same thing. We want to fetch a row. We can just pass the name of the row, which is now a character A because it's the content of the index, like zero to index in this case, and you will get this. You will get list. Values are of course only six and true because A is already in the index now, and yeah, the columns again become the index as we saw earlier as well. And you can do this as well. You can just, if you still want to go with row number, like zero based index, you can still do the eye-trail location, which is eye lock, and you can use that for doing the indexing, doing the fixing the rows as you were doing earlier. So let's talk about if you want to have multiple indexing, like multiple level indices. So what I've done in this case is I set the index and let's see the result first. So what I do is I pass the list of indices, which is one, one, two, two. So what that means is whatever my current index is, assign one and one to the first two elements in the indices and two and two to the other twos. So that means it will create a multi-level data frame, multi-level indexing the data frame, and one is going to be the sort of a parent index for NB, and two is going to be the same for C and D. So once we have this multi-level hierarchy, let's see how we can perform some of the operations again. Again we want to fetch two rows. Let's say we want to fetch all the rows which are under one index. We can similarly do this as we were doing earlier. And it will give us that frame because that's a structure for the data that we want because they are multiple rows, and if you just want fetch still one row, we can still do that, but what we need to do is we need to make sure that we traverse from one to A. So we simply pass a list of all the indices, the sort of hierarchy that we want to pass on and we'll just return this again. We have another thing which is like trans-posing data which is really useful when we are operating on like some metrics operations or something, and as you can see in this case, indices were one, two, and then the next level was A, B, C, and D, but now we have the same level of hierarchy in the column names. So the column names, the bar and bars become the indices, and now index is not multi-level anymore and it's just one level, and the column structure is multi-level now. So that was just about like manipulating data and manipulating rows and fetching rows that may have seemed really simple, but it's not that, like pandas is not like just for that. It's also for all the statistics, all the any statistics operation that you may want. So for example, this describe method, it is just like else is described. So if you return your useful information about your data, like the statistical information, like it will tell you like average, maximum, first part is second and third, bunch of things like this. So this is a useful method for finding any information about your data, like when you are like, okay, just have a glance about your data, like what's there, what's the information in your data. There's another method for finding the covariance between different columns or between different aspects of your data. And there's also this method for finding the correlation easily. And there are a bunch of other methods for finding the rank. Like if you have some value in the column and you want to fetch, if you find the rank of that value in the column, we can do easily do that, like what exactly the rank of this value for all the values in the column. And you also have another method for finding the cumulative sum of all the values in one column. Yeah. Okay. So now comes the most difficult part. That's a live demo. Let's hope it works. Is it visible at the last line? Yeah. Okay. How many of you are like football fans here? Do we have any football fans? Okay. Okay. So the data that I've fetched today is the number of goals put by Messi and Ronaldo in last ten years. And we're going to analyze their data and see how we can make some sense of the data that we have. So I'll go ahead and just import the library and this is a data frame. This is like, I actually construct the data frame from a dictionary. Maybe fetched from anywhere, like maybe come from some fetching the data from some mapping or some database or anywhere. And so once I build the data frame, if I try to print it, what it looks like, you may find familiar now because that's how it looks like. It looked like in my slides as well. So it has one row, like for each year, it has one row and it shows the number of goals scored by Messi and Ronaldo for that one year. Let's see what we can do. So since we want to, since we know that we make the index as year, then we know that we can easily fetch the number of goals put by any one of the players in that one year. So that's why I've created another index, which is the entry column, which is year. And now let's see how we can operate some of the operations to find, like to make more sense of this, and to see which one is better. So if you want to fetch the, all the goals scored by Messi or the, like all the performance of Messi in last 10 years, we can simply like just, is it as simple as accessing one column? We can just simply do that. And if you want to find the one row, like if you want to find in 2016, how many goals were scored by each of the pairs, you can simply do that. Like it's so easy. And if you want to find all the, all the, like all the entries when Messi scored less than Ronaldo, you can find all those years. And we, as we can see there, there are only six years when Ronaldo scored more, like not only but yeah. So this is, this is another useful method, which gives you information about your data. And it's clearly shows that it's a, it's a Python class, a data frame. You can see the entries are integers, 10 entries, 2017 to, 2007 to 16. And data columns are only two, Messi, then not no integer values and same for Ronaldo. And also shows like some are 250 bytes. Who cares? Oh, maybe care, but not really. So if we want to find the head, like we want to just see how the data looks, we can simply just pass the head and number of values that we want to fetch. And we'll just show you, show you sort of snapshot data, data frame, how it looks like. And same thing is if you want to see from the tail, you can mention the number of elements that you want to see. And both head and tail, if you don't mention any, any number of values that you want to see, they're going to show you five elements by default. So this is the method I was talking about described. So it gives you a bunch of statistical parameters. Like you can see the count, which is not really that useful in this case. Mean standard deviation, we can see the minimum 25 percentile, 50 percentile, 75 percentile and max value. So yeah, there are a bunch of other methods like finding the covariance between these two players, which is not really useful in this case, but it may be useful if you're like operating on some data, which really needs, in which we really need to find like how, like what's the covariance between some variables or you want to see something like that and you can really do that. And there's another thing which is like correlation. In this case, the correlation won't be really too much because they are like independent players and they don't like, they don't play like deadly scoring more and I'm going to score more as well. So there's not going to be much correlation. And we also have this sum. Okay. This one is interesting. So as we can see, messy has scored four goals than Ronaldo. I'm not saying that. Data is saying that. So don't blame me if you are like Ronaldo fan and you're saying no, it's better. So just that's what I say. And we always go with what data says. Yeah. I think messy has figured out the number of variations. So mess is not that reliable. Maybe. So yeah. Yeah. I knew that was coming. See, I'm not saying anything. I'm not making a statement here. So yeah, there's another method which is coming cumulatively sum and this really allows us to find the number of goals scored by each player at any moment. Like at any point of time, at any years, let's say we want to see like how many goals was scored in 2012, let's say, as you can see, like there were three, zero, four by messy and two, seven, zero by Ronaldo. So it's really easy to like make sense of data. This is of course really a small data set, but you can do whatever you can like you, whatever you want. Like you can do, uh, operations on big data as well. Like not exactly the big data, but yeah, the data that can hold in your memory. And, um, yeah. And yeah, that's all I have for the demo. And no. Okay. Anyway, I'm done. Yeah. Thanks. We have some questions. No. No, so the right for each of the element can be anything like it doesn't have to be same. Yeah, you can mix it, but it's going to be difficult for you if you have to manual that if you want to like put some condition on that it's really going to be you have to check for each value like you let's say you have integers and strings right in one column. Yeah, you can have that definitely but when you have the right faster data you have to recheck like if you are giving some condition here to check the type and then compare. So it's really going to be like difficult for you to make sense without that to analyze it and you can find me on this social link and yeah, feature to me if you have anything to talk about anything interesting to talk about. So do we have any questions here? How big would it be for us that we have to have where part of the whole integration that how big data should be to use partners? It should be more than one element. That depends on memory like because all the data that it's going to have is going to be in memory. So it just depends on what system you are on and it's really just independent. So it is like of course there's going to be in complexity thing as well but that's sort of proportional to what your how big your size. Do we have any more questions? So I guess there's no function for adding a second hold on because you have the second index one one and then you will transform the data correct? I'm not sure I understand your question. Then those, well the second index one one two. Yes. Then you put here and then you transform. Yes. Yes. And then you have a second column. Yes. I guess that's no. Oh yeah, yeah, yeah. I'm not sure about that whether we can, so your question is there whether we can add multiple level columns directly without doing the transpose right? I'm not really sure because the library is really big and I'm not aware of all the functions, all the methods, but I'm not really sure I can check that and see because the library is really huge and I'm not aware of all the methods. Yeah. Another one. Yeah, you can do that just the same way as you were doing like for this you need to go to one to A, let's say one from one A and you need to like pass one and A and it's going to see like okay it's one and yeah not different one so it's going from A, from one to A and it's going to just run the first column. So it's exactly same as we saw here. Yeah, it's just like traversing through hierarchy like just a tree or something like you pass along. Any more questions? Okay, thank you.
 Indices by default will be always be 0, 1, and 2.  And similarly, if you want to select multiple columns, you can simply pass the list of the  names of the columns that you want to fetch.  And any guesses for the structure will be there.  Exactly, easy, right?  So yeah, it will be a lot of frame.  And if you want to fetch a row, you can just simply pass the index of the row.  We just pass the index of the row to the location man, which is LOC.  And it will give you another series.  But as you can see, the indices now are changed.  Insts will be the column names now, because in this case, when we fetch a row, data is  really x, 6, and true in this case.  And the indices will be the names of the column, because those are the identifiers for any value.  So now if you want to fetch the multiple rows, what we can do is just do it the pythonic.  Just mention whichever rows we want.  And it will, of course, fetch the 0, 10 first row, like this.  So that was just like when you know that what you're going to fetch, but what about if you  have some conditions like if you want to fetch some data based on the value in some column,  then you can just do this.  So in the square baggage, just mention the condition that you have.  And easy to guess that it'd be data frame.  It will just return those rows, which satisfies the condition.  Condition can be on any number of columns, as we can see the source of a complicated example,  which is let's say we want to, let's say a hypothetical condition, we want to fetch  the rows which have x or z value in their first column.  We can do this.  Like it can be any sort of complicated condition, and it will just fetch according to your condition.  In this case, this.  So let's say we have these two data frames now, as you can see, there are a, b, c, and  d indices for the first one, and a, b, c columns, and the second one a, b, c, d, e as indices,  and a, b as columns.  So if we decide to merge this, if we decide to add this, which is like addition operation,  not exactly arithmetic, but we'll see how it is not exactly arithmetic.  It will return you this.  So as you can see, some of the values are some of corresponding values in both the data  frames, but some of them are not defined.  It's like a not a number, which is a non-type in numpy, and which is sort of portable because  it relies on numpy.  So why are some values not a number?  The reason is, for example, for e row, for e index, there's no value in the first data  frame, so it doesn't know what value to add, what value to fetch, and that's why it cannot  perform addition operation or a merge operation on e.  So that's why all the elements of e in the resultant data frame will be not a number,  and the same the case with the c column as well.  So we see a lot of not a number values, right?  How can we handle it?  Like if we could every day, right?  We know if something goes wrong, either we like draw it, either we like eliminate the  risk, eliminate the bug, or we fix it, right?  It's like as simple as that.  So let's see how we can handle these values.  We can either draw them, either we can say, OK, if anything is not a number, we don't  want to keep it, or we can just say that if anything's not a number, we're going to fill  it with some value on the basis of some logic.  So let's say the first thing, like if you want to drop the values, you can just pass  on the matter like drop NA, and by default, it's got to drop all the rows, which have  at least one not a number value, so it has at least one un-fine value.  It's going to drop all those rows, as we can see this.  And there may be a case when you want to say, OK, second row, like the index two row has  some values, has some data.  So you want to keep it because it has some data and we're not going to lose it.  For that, we have another method, which is like you can pass a parameter saying, like,  how do you want to drop the values?  You want to drop the values only if all of the values are un-fine.  So it will just pop the last row.  So it's not going to lose any data, which you are losing in the first case.  And let's talk about the case, like when you fill the values in some manner.  So we have this data frame again.  And what we can do is we can just pass a default value, which we want to, like, this is like  one case, and you know that there is something un-defined.  You want to fill it with something like let's say zero or minus one or something, which is  like the default value for your data, and it will just simply replace every not-defined  value with that default value that you pass.  And if you don't really want to do that, like if you're like, no, why should I fill with  zero?  Fine.  You can use the NA method with the parameter, which is like forward fill, F fill is for  forward fill.  And what we will do is it will take the value just above the not-defined value and copy  it all over.  So as you can see, in the second row, there was a not-fine, like not a number, but now  it is 10 because the 10 is copied from the last defined value.  And similarly, you have backward fill methods as well, and it's like pass the method equal  to the B fill and should be fine.  And yeah, so this was a case when it just copied over everything, right?  But there may be a case when you just want to copy one, like a copy twice, and you know  that if something is really wrong, then you want to drop all the rest of the values, but  you want to, surely, you want to copy some of the values.  So you can define the limit.  And since the limit is one in this case, you can see one not-did-not-anum value is still  left because, of course, because of one limit, and it won't copy more than once.  Let's talk about indexing now.  Like I've talked about indices like we have 0, 1, 2, or we have ABC.  We can have custom indices.  Let's talk about a little bit more in detail about that.  So for this data frame, we have this index, and we can just fetch the index.  We want to do something to the index.  In this case, it's not really going to be useful, but as we can see, we'll see later  it will be really like indices can be anything, and this is a way to access any index of the  data frame.  So let's say we have this data frame once again, and what we want to do is we want to  change the index, and we want to assign some column as index.  Like we want to use one column as index.  Just like we use in databases, we define some column as an index, and so that searching  is easy and everything is searching, and sorting everything is easy.  So we can do the same thing here.  We can just pass the name of the index that we want, and as you can see, the new data  frame that we will have will have that column as index.  So everything you are doing, you in the index now, will be done using these values, ABC  and D. Let's see how we can do that.  So same thing.  We want to fetch a row.  We can just pass the name of the row, which is now a character A because it's the content  of the index, like zero to index in this case, and you will get this.  You will get list.  Values are of course only six and true because A is already in the index now, and yeah, the  columns again become the index as we saw earlier as well.  And you can do this as well.  You can just, if you still want to go with row number, like zero based index, you can  still do the eye-trail location, which is eye lock, and you can use that for doing the  indexing, doing the fixing the rows as you were doing earlier.  So let's talk about if you want to have multiple indexing, like multiple level indices.  So what I've done in this case is I set the index and let's see the result first.  So what I do is I pass the list of indices, which is one, one, two, two.  So what that means is whatever my current index is, assign one and one to the first  two elements in the indices and two and two to the other twos.  So that means it will create a multi-level data frame, multi-level indexing the data  frame, and one is going to be the sort of a parent index for NB, and two is going to  be the same for C and D. So once we have this multi-level hierarchy,  let's see how we can perform some of the operations again.  Again we want to fetch two rows.  Let's say we want to fetch all the rows which are under one index.  We can similarly do this as we were doing earlier.  And it will give us that frame because that's a structure for the data that we want because  they are multiple rows, and if you just want fetch still one row, we can still do that,  but what we need to do is we need to make sure that we traverse from one to A.  So we simply pass a list of all the indices, the sort of hierarchy that we want to pass  on and we'll just return this again.  We have another thing which is like trans-posing data which is really useful when we are operating  on like some metrics operations or something, and as you can see in this case, indices were  one, two, and then the next level was A, B, C, and D, but now we have the same level  of hierarchy in the column names.  So the column names, the bar and bars become the indices, and now index is not multi-level  anymore and it's just one level, and the column structure is multi-level now.  So that was just about like manipulating data and manipulating rows and fetching rows that  may have seemed really simple, but it's not that, like pandas is not like just for that.  It's also for all the statistics, all the any statistics operation that you may want.  So for example, this describe method, it is just like else is described.  So if you return your useful information about your data, like the statistical information,  like it will tell you like average, maximum, first part is second and third, bunch of things  like this.  So this is a useful method for finding any information about your data, like when you  are like, okay, just have a glance about your data, like what's there, what's the information  in your data.  There's another method for finding the covariance between different columns or between different  aspects of your data.  And there's also this method for finding the correlation easily.  And there are a bunch of other methods for finding the rank.  Like if you have some value in the column and you want to fetch, if you find the rank  of that value in the column, we can do easily do that, like what exactly the rank of this  value for all the values in the column.  And you also have another method for finding the cumulative sum of all the values in one  column.  Yeah.  Okay.  So now comes the most difficult part.  That's a live demo.  Let's hope it works.  Is it visible at the last line?  Yeah.  Okay.  How many of you are like football fans here?  Do we have any football fans?  Okay.  Okay.  So the data that I've fetched today is the number of goals put by Messi and Ronaldo in  last ten years.  And we're going to analyze their data and see how we can make some sense of the data  that we have.  So I'll go ahead and just import the library and this is a data frame.  This is like, I actually construct the data frame from a dictionary.  Maybe fetched from anywhere, like maybe come from some fetching the data from some mapping  or some database or anywhere.  And so once I build the data frame, if I try to print it, what it looks like, you may find  familiar now because that's how it looks like.  It looked like in my slides as well.  So it has one row, like for each year, it has one row and it shows the number of goals  scored by Messi and Ronaldo for that one year.  Let's see what we can do.  So since we want to, since we know that we make the index as year, then we know that  we can easily fetch the number of goals put by any one of the players in that one year.  So that's why I've created another index, which is the entry column, which is year.  And now let's see how we can operate some of the operations to find, like to make more  sense of this, and to see which one is better.  So if you want to fetch the, all the goals scored by Messi or the, like all the performance  of Messi in last 10 years, we can simply like just, is it as simple as accessing one column?  We can just simply do that.  And if you want to find the one row, like if you want to find in 2016, how many goals  were scored by each of the pairs, you can simply do that.  Like it's so easy.  And if you want to find all the, all the, like all the entries when Messi scored less  than Ronaldo, you can find all those years.  And we, as we can see there, there are only six years when Ronaldo scored more, like not  only but yeah.  So this is, this is another useful method, which gives you information about your data.  And it's clearly shows that it's a, it's a Python class, a data frame.  You can see the entries are integers, 10 entries, 2017 to, 2007 to 16.  And data columns are only two, Messi, then not no integer values and same for Ronaldo.  And also shows like some are 250 bytes.  Who cares?  Oh, maybe care, but not really.  So if we want to find the head, like we want to just see how the data looks, we can simply  just pass the head and number of values that we want to fetch.  And we'll just show you, show you sort of snapshot data, data frame, how it looks like.  And same thing is if you want to see from the tail, you can mention the number of elements  that you want to see.  And both head and tail, if you don't mention any, any number of values that you want to  see, they're going to show you five elements by default.  So this is the method I was talking about described.  So it gives you a bunch of statistical parameters.  Like you can see the count, which is not really that useful in this case.  Mean standard deviation, we can see the minimum 25 percentile, 50 percentile, 75 percentile  and max value.  So yeah, there are a bunch of other methods like finding the covariance between these  two players, which is not really useful in this case, but it may be useful if you're  like operating on some data, which really needs, in which we really need to find like  how, like what's the covariance between some variables or you want to see something like  that and you can really do that.  And there's another thing which is like correlation.  In this case, the correlation won't be really too much because they are like independent  players and they don't like, they don't play like deadly scoring more and I'm going to  score more as well.  So there's not going to be much correlation.  And we also have this sum.  Okay.  This one is interesting.  So as we can see, messy has scored four goals than Ronaldo.  I'm not saying that.  Data is saying that.  So don't blame me if you are like Ronaldo fan and you're saying no, it's better.  So just that's what I say.  And we always go with what data says.  Yeah.  I think messy has figured out the number of variations.  So mess is not that reliable.  Maybe.  So yeah.  Yeah.  I knew that was coming.  See, I'm not saying anything.  I'm not making a statement here.  So yeah, there's another method which is coming cumulatively sum and this really allows us  to find the number of goals scored by each player at any moment.  Like at any point of time, at any years, let's say we want to see like how many goals was  scored in 2012, let's say, as you can see, like there were three, zero, four by messy  and two, seven, zero by Ronaldo.  So it's really easy to like make sense of data.  This is of course really a small data set, but you can do whatever you can like you,  whatever you want.  Like you can do, uh, operations on big data as well.  Like not exactly the big data, but yeah, the data that can hold in your memory.  And, um, yeah.  And yeah, that's all I have for the demo.  And no.  Okay.  Anyway, I'm done.  Yeah.  Thanks.  We have some questions.  No.  No, so the right for each of the element can be anything like it doesn't have to be same.  Yeah, you can mix it, but it's going to be difficult for you if you have to manual that  if you want to like put some condition on that it's really going to be you have to check  for each value like you let's say you have integers and strings right in one column. Yeah,  you can have that definitely but when you have the right faster data you have to recheck like  if you are giving some condition here to check the type and then compare. So it's really going to  be like difficult for you to make sense without that to analyze it and you can find me on this  social link and yeah, feature to me if you have anything to talk about anything interesting to  talk about. So do we have any questions here?  How big would it be for us that we have to have where part of the whole  integration that how big data should be to use partners?  It should be more than one element. That depends on memory like because all the data that it's  going to have is going to be in memory. So it just depends on what system you are on and it's  really just independent. So it is like of course there's going to be in complexity thing as well  but that's sort of proportional to what your how big your size. Do we have any more questions?  So I guess there's no function for adding a second hold on because you have the second index  one one and then you will transform the data correct? I'm not sure I understand your question.  Then those, well the second index one one two. Yes.  Then you put here and then you transform. Yes. Yes. And then you have a second  column. Yes. I guess that's no.  Oh yeah, yeah, yeah. I'm not sure about that whether we can, so your question is there whether we  can add multiple level columns directly without doing the transpose right? I'm not really sure  because the library is really big and I'm not aware of all the functions, all the methods,  but I'm not really sure I can check that and see because the library is really huge and I'm  not aware of all the methods. Yeah. Another one.  Yeah, you can do that just the same way as you were doing like for this you need to go to one to  A, let's say one from one A and you need to like pass one and A and it's going to see like okay  it's one and yeah not different one so it's going from A, from one to A and it's going to just run  the first column. So it's exactly same as we saw here.  Yeah, it's just like traversing through hierarchy like just a tree or something like you pass along.  Any more questions? Okay, thank you.
Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_0_263.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_264_10883.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_10884_12071.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_12072_13295.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_13296_15479.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_15480_16523.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_16524_16571.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_16572_16895.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_16896_17039.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_17040_17159.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_17160_17255.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_17256_17363.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_17364_17663.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_17664_18311.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_18312_18443.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_18444_20795.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_20796_21383.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_21384_21431.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_21432_21755.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_21756_22091.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_22092_23687.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_23688_24023.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_24024_24563.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_24564_24683.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_24684_25175.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_25176_25559.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_25560_26447.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_26448_27551.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_27552_27671.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_27672_27779.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_27780_28031.png Introduction_to_Pandas_Introduction_to_the_open_source_data_analysis_and_manipulation_librar_28032_34250.png